JPA, playframework, выберите порядок, прежде чем сгруппировать по - PullRequest
1 голос
/ 15 октября 2011

Как мне написать запрос в "JPA" что будет заказывать до GROUP BY?

Например:

select m from Message m where m.id = (
  select distinct m2.conversation_id
    from Message m2
   where m2.from = 100 or m2.to = 100
)
group by m.conversation_id order by m.date desc

Мне нужны последние (самые последние) сообщения для каждого идентификатора разговора.

1 Ответ

2 голосов
/ 16 октября 2011

Вкратце, вы не можете поместить ORDER BY перед GROUP BY;SQL требует ORDER BY после GROUP BY.

. Однако вы можете достичь требуемого результата - либо воспользовавшись описанным ниже длинным методом, либо структурировав свой запрос с помощью другого предложения ORDER BY:

ORDER BY m.conversation_id, m.date DESC

В коде, который выбирает данные из БД, вы выбираете первую строку для каждого нового возвращаемого идентификатора диалога.

Как всегда, я строю запрос поэтапно.Во-первых, найдите метку времени самого последнего сообщения для каждого идентификатора разговора, который включает «идентификатор пользователя 100»:

SELECT m2.conversation_id, MAX(m2.date) AS date
  FROM Message AS m2
 WHERE m2.from = 100 OR m2.to = 100
 GROUP BY m2.conversation_id

Теперь, объедините его с исходной таблицей, чтобы получить интересующие строки:

SELECT m1.*
  FROM Message AS m1
  JOIN (SELECT m2.conversation_id, MAX(m2.date) AS date
          FROM Message AS m2
         WHERE m2.from = 100 OR m2.to = 100
         GROUP BY m2.conversation_id
       ) AS m3
    ON m1.conversation_id = m3.conversation_id AND m1.date = m3.date
 ORDER BY m1.date DESC;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...