упорядочить по соотношению один-ко-многим - PullRequest
2 голосов
/ 24 августа 2011

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

Message:
    id:         INT
    created_at: DATETIME

Comment:
    id:         INT
    message_id: INT
    created_at: DATETIME

Один Message имеет много Comments.

Я хочу получить все заказы Messages по самым последним действиям:

  • Если Message имеет Comments, то в качестве индикатора активности Message
  • Если Message не имеет Comments, это значение created_at является индикатором активности

В общем, я хочу отсортировать его как классическую систему электронной почты или систему личных сообщений.

Может быть, я могу INNER JOIN Комментарии, но я не думаю, что нужно получать все комментарии только для сортировки.

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

Я использую Doctrine, так что если у вас есть решение на основе Doctrine, я бы предпочел, чтобы

Спасибо!

Ответы [ 3 ]

1 голос
/ 24 августа 2011

То, что я бы сделал в MySQL, выглядит примерно так:

SELECT *
FROM Messages AS m
ORDER BY GREATEST(
   m.created_at, 
   (SELECT MAX( c.created_at ) FROM Comment AS c WHERE c.message_id = m.id )
) DESC 
1 голос
/ 24 августа 2011

Попробуйте что-то вроде этого:

select m.message_id, c.created_at, m.created_at 
from message m
left join (
    select message_id, MAX(created_at) as created_at
    from comment
    group by message_id
) c on m.id = c.message_id
order by 
    ( case when c.created_at >= m.created_at then c.created_at
          else m.created_at
     end ) desc

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

Возможно, вам придется изменить синтаксис регистра для mysql.

0 голосов
/ 24 августа 2011

Если идентификатор вашей таблицы комментариев - автоинкремент, вы можете просто упорядочить по id desc, и он будет возвращать результаты в хронологическом порядке, если вы не выполняете удаления в таблице комментариев, которая имеет тенденцию к тому, чтобы вставки отображалисьвне хронологического порядка.В противном случае вам нужно сделать что-то вроде:

SELECT a.id, a.created_at 
FROM Message a, Comment b 
WHERE b.created_at > a.created_at 
ORDER BY b.created_at DESC 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...