Google Answers Logo
View Question
 
Q: Select top N per unique columnName in mySQL ( No Answer,   5 Comments )
Question  
Subject: Select top N per unique columnName in mySQL
Category: Computers > Programming
Asked by: lticket-ga
List Price: $4.50
Posted: 05 Jun 2006 02:54 PDT
Expires: 07 Jun 2006 06:31 PDT
Question ID: 735386
I'm looking for a mySQL query which will give me N records per unique
columnName. Consider the following table;

Name, Company, Other info... 
Dave, RBS, x 
Rob, RBS, x 
Jim, RBS, x 
Bob, RBS, x 
Karen, RBS, x 
Dave, Digex, x 
Lee, Digex, x 
Mike, FDR, x 
Wayne, FDR, x 
Sarah, FDR, x 
Yasmin, FDR, x 

I would expect the query to return;

Dave, Rob, Jim, Dave, Lee, Mike, Wayne and Sarah (and their
accompanying company/otherInfo)

I've managed to achieve this is Microsoft Access using the following SQL query;

SELECT 
Company 
, Name 
, OtherStuff 
FROM someTable 
WHERE 
DCount("name","someTable","Name <= '" & [name] & "' AND company = '" &
[company] & "'")<=3
ORDER BY Company, Name; 

but now want to do it in mySQL (i'm using version 4.1.10) it would be
a bonus too if anyone knows a way of doing it in SQL Server or Oracle.

I do not want to use;
a) a php script with a for each loop 
b) a stored procedure 

Hope you can help!

Thanks
Answer  
There is no answer at this time.

Comments  
Subject: Re: Select top N per unique columnName in mySQL
From: neomeneo-ga on 06 Jun 2006 10:40 PDT
 
I'm just playing with google answers ... it turns out I have an answer
for your question :) I have to post it as a comment  because the
registration for researcher accounts is closed.

SET @a:=0;SELECT p.*, (@a:=@a+1) AS rownum 
FROM person p
GROUP BY company, rownum
HAVING rownum <= 3
Subject: Re: Select top N per unique columnName in mySQL
From: neomeneo-ga on 06 Jun 2006 10:42 PDT
 
actually ejemm ... my previous post is not a complete answer for your
question, altough I hope it will help ;)
Subject: Re: Select top N per unique columnName in mySQL
From: neomeneo-ga on 06 Jun 2006 10:47 PDT
 
any how, here is the complete answer:

SET @a:=0;SELECT p.*, IF(@c=p.company, @a:=@a+1, @a:=1) AS rownum, (@c:=p.company) 
FROM person p
GROUP BY company, rownum
HAVING rownum <= 3
Subject: Re: Select top N per unique columnName in mySQL
From: lticket-ga on 07 Jun 2006 01:49 PDT
 
Thanks neomeneo! That looks like it is on the right lines but doesn't
appear to be returning what I want. I'm just getting 1 row from each
company- though it does look a bit like it could be a bug in
phpMyAdmin as it says;

Showing rows 30 - 59 (123 total, Query took 0.0408 sec)

...and yet there are only 11records on the screen (plus the 30records
from page 1)... so 41 records (1/3rd the amount should be returned?)

I'll see what happens if i execute from php or a gui mySQL front-end.
Subject: Re: Select top N per unique columnName in mySQL
From: lticket-ga on 07 Jun 2006 06:31 PDT
 
Yessssssssssss! I just cracked it! Many, many, many thanks neomeneo,
couldn't have done it without your help!

SET @c:=0;
SET @a:=0;
SELECT p.*, IF(@c=p.company, @a:=@a+1, @a:=1) AS rownum, (@c:=p.company) 
FROM person p
GROUP BY company, rownum
HAVING rownum <= 3

I looked and @c was returning NULL for every record because it hadn't
been dimmed i guess?

Work now though! Awesome!

Important Disclaimer: Answers and comments provided on Google Answers are general information, and are not intended to substitute for informed professional medical, psychiatric, psychological, tax, legal, investment, accounting, or other professional advice. Google does not endorse, and expressly disclaims liability for any product, manufacturer, distributor, service or service provider mentioned or any opinion expressed in answers or comments. Please read carefully the Google Answers Terms of Service.

If you feel that you have found inappropriate content, please let us know by emailing us at answers-support@google.com with the question ID listed above. Thank you.
Search Google Answers for
Google Answers  


Google Home - Answers FAQ - Terms of Service - Privacy Policy