Групповой заказ в MySQL - PullRequest
0 голосов
/ 19 марта 2012

У меня следующий запрос:

SELECT * FROM quotes 
INNER JOIN quotes_panels ON quotes.wp_user_id = quotes_panels.ID 
WHERE quotes.created >= '$startDate' 
AND quotes.created <= '$endDate' AND quotes.wp_user_id != '0'

Этот запрос может создать несколько строк от одного и того же пользователя (quotes.wp_user_id), но я хочу показать только строку с самой большой площадью крыши (quotes.roofarea).

Однако, когда я добавил GROUP BY quotes.wp_user_id, он автоматически берет строку с самым низким quotes.ID, а не строку с самой большой quotes.roofarea. При добавлении ORDER BY quotes.roofarea DESC в конец запроса он упорядочил все результаты, а не только результаты "GROUP BY".

Может ли кто-нибудь помочь с получением желаемых результатов для запроса?

Спасибо

Ответы [ 4 ]

0 голосов
/ 19 марта 2012

Попробуйте это

SELECT * FROM quotes 
INNER JOIN quotes_panels ON quotes.wp_user_id = quotes_panels.ID 
WHERE quotes.created >= '$startDate' 
AND quotes.created <= '$endDate' AND quotes.wp_user_id != '0'
AND quotes.roofarea = (SELECT MAX(q.roofarea) FROM quotes q WHERE q.wp_user_id = quotes.wp_user_id)
GROUP BY quotes.wp_user_id

Проверить сейчас

0 голосов
/ 19 марта 2012

В MySQL GROUP BY выполняется до ORDER BY, поэтому вам нужно сделать это в двух запросах:

SELECT * FROM
    (SELECT * FROM quotes 
    INNER JOIN quotes_panels ON quotes.wp_user_id = quotes_panels.ID 
    WHERE quotes.created >= '$startDate' 
    AND quotes.created <= '$endDate' AND quotes.wp_user_id != '0'
    ORDER BY quotes.roofarea DESC) AS subset
GROUP BY subset.wp_user_id
0 голосов
/ 19 марта 2012

Вы должны добавить агрегатную функцию следующим образом:

SELECT *, MAX(quotes.roofarea) FROM quotes 
INNER JOIN quotes_panels ON quotes.wp_user_id = quotes_panels.ID 
WHERE quotes.created >= '$startDate' 
AND quotes.created <= '$endDate' AND quotes.wp_user_id != '0'
GROUP BY quotes.wp_user_id

Подробнее об этом здесь:

http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html

0 голосов
/ 19 марта 2012

Вы должны упорядочить строки, прежде чем сгруппировать их.

SELECT * FROM (SELECT * FROM quotes 
INNER JOIN quotes_panels ON quotes.wp_user_id = quotes_panels.ID 
WHERE quotes.created >= '$startDate' 
AND quotes.created <= '$endDate' AND quotes.wp_user_id != '0' 
ORDER BY quotes.roofarea DESC) a 
GROUP BY a.wp_user_id
...