GROUP BY после ЗАКАЗАТЬ - PullRequest
       23

GROUP BY после ЗАКАЗАТЬ

9 голосов
/ 05 сентября 2011

Мне нужно сделать GROUP BY после ORDER BY.Я не понимаю, почему MySQL не поддерживает это.Это мой код:

SELECT
    `pages`.`id`,
    `contents`.`id_language`,
    [...]

[...]

ORDER BY
    FIND_IN_SET(`languages`.`id`, '3') DESC

[the GROUP BY]

Результаты будут примерно такими:

id | id_language | ...
1    3
1    1
2    3
2    5
2    1

Мне нужно сгруппировать по идентификатору, мне нужен только первый результат, и мне нужно сохранить ввид.Я не могу использовать SUBQUERY из-за этого.

Результат должен быть:

id | id_language | ...
1    3
2    3

Примечание: id_language = 3 не следует путать, потому что это неправить.

Ответы [ 4 ]

8 голосов
/ 29 декабря 2011
SELECT id, idl
FROM (SELECT
    `pages`.`id` as id,
    `contents`.`id_language` as idl,
    [...]

[...]

ORDER BY
    FIND_IN_SET(`languages`.`id`, '3') DESC
     ) d
GROUP BY d.id
1 голос
/ 05 сентября 2011

Вам может потребоваться дополнительный столбец в исходном запросе, который вы GROUP BY, наряду с тем, по чему вы в данный момент группируете. Этот столбец, когда он сгруппирован, может быть использован для последующего заказа. Например:

SELECT
    SUM(IF(`languages`.`id` = 3, 1, 0)) AS languageOrder,
    `pages`.`id`,
    `contents`.`id_language`,
    [...]

[...]

[GROUP BY...]

ORDER BY languageOrder DESC

Я хотел бы, чтобы languageOrder был положительным для групп, которые содержат язык # 3, 0 в противном случае. Таким образом, группы, содержащие язык 3, будут наверху.

1 голос
/ 05 сентября 2011

Group By группирует наборы результатов и обычно используется для агрегирования. Order By - это способ сортировки результатов.

0 голосов
/ 05 сентября 2011

Очень забавно , попробуйте

select * from your_table
where id_language=3
order by id;

Насколько я могу судить, набор правил id_language=3,
которые не отличаются от использования where

...