Что ж, если вы ищете способ просто перечислить страницы в порядке большинства комментариев, я бы сгруппировал по идентификатору страницы, а затем упорядочил по количеству, например:
select page_id, count(*)
from comments
group by page_id
order by 2 desc, 1 asc
Технически, вам не нужно 1 asc
, но мне нравится обеспечивать определенный порядок даже в пределах количества комментариев по убыванию. Таким образом, если появляется много страниц с одинаковым количеством комментариев, вы можете легко найти определенную страницу в этой группе. Другими словами, если на странице 7 было два комментария, а на всех других страницах было только одно, вы бы получили (7,1,2,3,4,5,6,8,9)
. Без 1 asc
страницы с 1 по 6 и с 8 по 9 могут возвращаться в любом порядке, например (7,6,2,4,3,9,1,8,5)
, и даже могут меняться между запусками запроса.
Например, построить пример таблицы:
> DROP TABLE COMMENTS;
> CREATE TABLE COMMENTS (PAGE_ID INTEGER,COMMENT VARCHAR(10));
> INSERT INTO COMMENTS VALUES (1,'1A');
> INSERT INTO COMMENTS VALUES (2,'2A');
> INSERT INTO COMMENTS VALUES (1,'1B');
> INSERT INTO COMMENTS VALUES (3,'3A');
> INSERT INTO COMMENTS VALUES (2,'2B');
> INSERT INTO COMMENTS VALUES (1,'1C');
> INSERT INTO COMMENTS VALUES (3,'3B');
> INSERT INTO COMMENTS VALUES (3,'3C');
> INSERT INTO COMMENTS VALUES (3,'3D');
Затем показать все данные:
> SELECT * FROM COMMENTS
ORDER BY 1, 2;
+---------+---------+
| PAGE_ID | COMMENT |
+---------+---------+
| 1 | 1A |
| 1 | 1B |
| 1 | 1C |
| 2 | 2A |
| 2 | 2B |
| 3 | 3A |
| 3 | 3B |
| 3 | 3C |
| 3 | 3D |
+---------+---------+
Затем выполните выборку для группировки по убыванию количества комментариев:
> SELECT PAGE_ID,COUNT(*) AS QUANT
FROM COMMENTS
GROUP BY PAGE_ID
ORDER BY 2 DESC, 1 ASC;
+---------+-------+
| PAGE_ID | QUANT |
+---------+-------+
| 3 | 4 |
| 1 | 3 |
| 2 | 2 |
+---------+-------+