Группировать комментарии по одной записи, упорядочивать по дате - PullRequest
1 голос
/ 02 сентября 2011

У меня есть таблица с именем comments со следующей структурой:

id | entry_id | date | comment

У меня также есть таблица с именем entries со следующей структурой:

entry_id | title | date | entry

Я просто хочу показать последние комментарии и записи, к которым эти комментарии были добавлены.

Сейчас я использую этот запрос:

SELECT c.id,
       c.date,
       c.comment,
       e.entry_id,
       e.title
FROM   entries e
       INNER JOIN comments c
        ON e.entry_id = c.entry_id
GROUP  BY c.date DESC
LIMIT  50

И я вывожу результаты так:

#entry_id
  1 hour ago:
  Some comment

#entry_id
  2 hours ago:
  Some comment    

Комментарии упорядочены по дате. То, что я пытаюсь сделать, это просто сгруппировать комментарии по тому же entry_id, например ::

#entry_id
  1 hour ago:
  Some comment

  2 hours ago:
  Some comment without  repeating the `entry_id`

#other entry_id
  5 hours ago:
  Some comment

Как бы я это сделал? Не нужно писать код для меня, просто скажите, как бы вы сделали это (в псевдокоде, например). Это группировка комментариев как на фейсбуке или гугл + стрим, надеюсь, вы понимаете, о чем я.

Ответы [ 3 ]

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

Использовано это: Группировка массивов в PHP

Я думаю, что мне не следует писать так много подробностей о моей структуре таблиц MySQL, делать это с помощью PHP и массивов Спасибо всем за внимание.

$groups = array();

foreach($items as $item)
    $groups[$item['value']][] = $item;
0 голосов
/ 02 сентября 2011

Я полагаю, что вы делаете запрос, подобный этому

select
  e.entry, e.title, c.comment, c.date
from 
  comments c join entries e on c.entry_id = e.entry_id
order by 
  e.entry_id, c.date desc

и цикл по вашему набору результатов, пока entry_id все тот же. Хотя я не уверен, основываясь на вашем вопросе, где вы хотите вывод. В коде или в редакторе sql.

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

Сначала сгруппируйте по entry_ID, а затем сгруппируйте по максимальной дате.То, что вас волнует, является самым последним.(Вот как это делает Facebook.)

Вот код TSQL

Во внутреннем запросе я выбираю entry_id и дату последнего комментария.

ЗатемЯ ссылаюсь на этот список, упорядочивая либо по последнему комментарию, либо по последней записи (в зависимости от того, что произошло совсем недавно), а затем упорядочивая их по entry_id (поэтому все комментарии к записям будут первыми и, наконец, по дате, поэтому комментарии внутри записибудет в правильном порядке.

Примечание. Я не проверял этот код, поэтому в нем могут быть некоторые опечатки.

SELECT * FROM
  (SELECT e.entry_id, MAX(c.date) as latest
  FROM   entries e
  INNER JOIN comments c ON e.entry_id = c.entry_id
  GROUP BY e.entry_id DESC, max(c.date)
  ) AS LIST
LEFT JOIN entries e ON e.entry_id = LIST.entry_ID
LEFT JOIN comments c on c.entry_ID = LIST.entry_ID
ORDER BY MAX(e.date,list.latest) as time_of_entry_or_comment DESC,
                                    e.entry_ID, 
                                    c.date DESC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...