Комплексная сортировка и группировка с MySQL - PullRequest
0 голосов
/ 26 июля 2011

У меня есть таблица ff:

---------------------------
ID | ChapterNo | HitCount |  
---------------------------
1  |    2      |   1000   |
2  |    2      |   2000   |
3  |    1      |   3000   |
4  |    3      |   1000   |
5  |    1      |   3500   |
---------------------------

В основном мне нужно заархивировать этот результат:

Получить все уникальные чаптерно, у каждого из которых самый высокий счетчик попаданий, а затем упорядочить по убыванию чаптерно

ID | ChapterNo | HitCount |  
---------------------------
4  |    3      |   1000   |
2  |    2      |   2000   |
5  |    1      |   3500   |
---------------------------

Я попробовал фф. запрос:

SELECT t1.*, Max(t1.hitcount) AS maxhit
FROM chapter as t1
GROUP BY t1.chapterno
ORDER BY t1.chapterno DESC

Но кое-как он не возвращает тот, у кого наибольшее количество хитов.

Как я могу это исправить?

Спасибо

Ответы [ 5 ]

4 голосов
/ 26 июля 2011
SELECT t1.*, t1.hitcount AS maxhit
FROM chapter as t1
WHERE t1.hitcount = (select max(hitcount) from chapter where chapterno = t1.chapterno)
ORDER BY t1.chapterno DESC
2 голосов
/ 26 июля 2011
SELECT t1.id, t1.chapterno, t2.maxhits
FROM chapter as t1, 
    (SELECT id, chapterno, Max(hitcount) AS maxhits
     FROM chapter 
     GROUP BY chapterno) AS t2
WHERE t2.chapterno = t1.chapterno
AND t1.hitcount = t2.maxhits
ORDER BY t1.chapterno DESC
1 голос
/ 26 июля 2011

, хотя все вышеприведенные ответы идеальны, я думаю, что это также можно сделать, используя SELF JOIN

SELECT *
FROM chapter ch
WHERE (
   SELECT COUNT(*) FROM chapter ch2
   WHERE ch2.chapterno = ch.chapterno and ch2.hitcount > ch.hitcount
) <= 2;
1 голос
/ 26 июля 2011
SELECT t1.*, t1.hitcount AS maxhit
FROM chapter as t1
WHERE t1.hitcount = (
    SELECT MAX t1.hitcount
    from chapter as t2
    where t2.ChapterNo = t1.chapterNo
)
ORDER BY t1.chapterno DESC

При этом используется коррелированный подзапрос, который может стать неэффективным. Другая возможность - использовать некоррелированный запрос в соединении from или left.

Подробнее об этой статье

1 голос
/ 26 июля 2011

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

SELECT c1.id, c1.ChapterNo, c1.HitCount FROM chapter c1
JOIN (SELECT ChapterNo, MAX(HitCount) max_hitCount
      FROM chapter
      GROUP BY ChapterNo) c2
ON c1.ChapterNo = c2.ChapterNo AND c1.HitCount = c2.max_hitCount
ORDER BY c1.ChapterNo DESC;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...