MySQL Заказ по сумме той же категории не работает, если сумма одинакова - PullRequest
1 голос
/ 18 апреля 2020

У меня есть запрос mySQL, с помощью которого я упорядочиваю список по количеству того же столбца "категория"

Запрос выглядит так:

SELECT mt.id, mt.category 
FROM table mt 
JOIN ( SELECT category, 
COUNT(*) AS ct FROM table GROUP by category ) sq 
ON mt.category = sq.category 
ORDER by sq.ct DESC, id ASC

, поэтому я могу упорядочить этот список:

id| category
1 | Apple
2 | Apple
3 | Cherry
4 | Banana
5 | Banana
6 | Apple

по этому:

1 | Apple
2 | Apple
6 | Apple
4 | Banana
5 | Banana
3 | Cherry

Everythnig работает как положено, но когда у нас одинаковое количество объектов с такой же категорией, как это:

1 | Apple
2 | Apple
3 | Cherry
4 | Banana
5 | Banana
6 | Apple
7 | Banana

запрос смешивает их и не разделяет их должным образом, и результат выглядит следующим образом:

1 | Apple
2 | Apple
4 | Banana
5 | Banana
6 | Apple
7 | Banana
3 | Cherry

Кто-то знает, почему это происходит?

Ответы [ 2 ]

1 голос
/ 18 апреля 2020

В MySQL 8+ оконные функции - лучший способ написать это. Я хочу отметить, что в более ранних версиях вы можете использовать подзапрос:

SELECT mt.id, mt.category 
FROM table mt 
ORDER BY (SELECT COUNT(*) FROM table mt2 WHERE mt2.category = mt.category),
         mt2.catgory, id;

При индексе mt(category) это может быть даже более эффективным, чем метод агрегирования.

1 голос
/ 18 апреля 2020

Вы можете просто добавить category к предложению order by:

ORDER by sq.ct DESC, mt.category, mt.id ASC

Обратите внимание, что если вы используете MySQL 8.0, вы можете упростить запрос, используя функции окна, а не объединение с агрегированным запросом:

SELECT id, category
FROM mytable mt
ORDER BY
    COUNT(*) OVER(PARTITION BY category) DESC,
    category,
    id
...