Порядок сверху прокомментирован - PullRequest
2 голосов
/ 27 апреля 2010

Как бы я перечислил страницу самых популярных страниц сайта с PHP и mysql?

База данных настроена примерно так:

page_id | username | comment | date_submitted
--------+----------+---------+---------------
      1 |  bob     | hello   | current date
      1 |  joe     | byebye  | current date
      4 |  joe     | stuff   | date
      3 |  mark    | this    | a date

Как бы вы запросили его, чтобы он упорядочивал их по страницам с наибольшим количеством комментариев?

Вот простой запрос для начала (с XXX областями, в которых, я думаю, мне нужна помощь):

$querycomments = sprintf("SELECT * FROM comments WHERE " .
    "XXX = %s ORDER BY XXX DESC",
    GetSQLValueString(????????????, "text"));

1 Ответ

3 голосов
/ 27 апреля 2010

Что ж, если вы ищете способ просто перечислить страницы в порядке большинства комментариев, я бы сгруппировал по идентификатору страницы, а затем упорядочил по количеству, например:

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 |
    +---------+-------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...