[EMAIL PROTECTED] wrote on 01/17/2005 06:45:22 PM:

> Hi there:
> 
> I have a "How do I..." SQL question regarding selecting
> distinct values from a field not included in an aggregated
> query when LIMIT is in effect, illustrated by the
> following example:
> 
> Table a contains the names of individuals, the places
> they have visited and the year in which they were visited.
> 
> Let's see who has visited where and when:
> 
> SELECT * FROM a;
> 
>  name   place   year
> ------ ------- ------
>  kim    north   2004
>  kim    south   2003
>  kim    south   2003
>  bob    west    2004
>  bob    west    2004
>  bob    west    2003
>  joe    south   2004
>  joe    south   2005
>  sue    west    2004
>  bob    east    2003
>  joe    east    2004
>  joe    east    2004
>  sue    south   2004
>  bob    north   2004
>  bob    north   2005
> 
> Summarize data by number of places visited by year:
> 
> SELECT count(*) AS count, name, year FROM a
>   GROUP BY name, year
>   ORDER BY count DESC, name ASC;
> 
>  count   name   year
> ------- ------ ------
>    3     bob    2004
>    3     joe    2004
>    2     bob    2003
>    2     kim    2003
>    2     sue    2004
>    1     bob    2005
>    1     kim    2004
>    1     joe    2005
> 
> Return only four rows beginning at second row:
> 
> SELECT count(*) AS count, name, year FROM a
>   GROUP BY name, year
>   ORDER BY count DESC, name ASC
>   LIMIT 4 OFFSET 1;
> 
>  count   name   year
> ------- ------ ------
>    3     joe    2004 s,e,e
>    2     bob    2003 w,e
>    2     kim    2003 s,s
>    2     sue    2004 s,w
> 
> Select only places visited included in LIMITed query:
> 
> SELECT DISTINCT place FROM a ????;

Put the results of the LIMITed query into a temporary table and re-query.


CREATE TEMPORARY TABLE tmpStep1 (
        freq int
        , name varchar(25)
        , year int
);

INSERT tmpStep1 (freq, name, year)
SELECT count(*) AS count, name, year FROM a
   GROUP BY name, year
   ORDER BY count DESC, name ASC
   LIMIT 4 OFFSET 1;

select distinct a.place
from tmpStep1 ts1
INNER JOIN a
        on a.name = ts1.name;

Then you should get the list:
> 
>  place 
> -------
>  south
>  west
>  east
> 
> Note that the place north does not appear in the last result
> because north was only visited by bob in 2005 and kim in 2004,
> records which are not included in the limited result.
> 
> Any help appreciated.
> 
> I would like to be compatible with 3.23.xx.
> 
> -Bob
> 
> -- 
> MySQL General Mailing List
> For list archives: http://lists.mysql.com/mysql
> To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]
> 

Basically, if you need to treat a set of results as source data, your best 
option is to make a table (temporary or permanent) out of your results. 
Then when you are through, cleanup for the next time.

DROP TEMPORARY TABLE tmpStep1;

Shawn Green
Database Administrator
Unimin Corporation - Spruce Pine

Reply via email to