要解决pg中的groupwise-max,可以使用DISTINCT ON
。就像这样:
SELECT
DISTINCT ON(pm.user_id)
pm.user_id,
pm.text
FROM
private_messages AS pm
WHERE pm.recipient_id= <my user id>
ORDER BY pm.user_id, pm.id DESC;
http://sqlfiddle.com/#!12/4021d/19
要获取最新的X但是我们将有子查询中使用它:
SELECT
q.user_id,
q.id,
q.text
FROM
(
SELECT
DISTINCT ON(pm.user_id)
pm.user_id,
pm.id,
pm.text
FROM
private_messages AS pm
WHERE pm.recipient_id=2
ORDER BY pm.user_id, pm.id DESC
) AS q
ORDER BY q.id DESC
LIMIT 10;
http://sqlfiddle.com/#!12/4021d/28
要获取发出和收到的线程:
SELECT
q.user_id,
q.recipient_id,
q.id,
q.text
FROM
(
SELECT
DISTINCT ON(pm.user_id,pm.recipient_id)
pm.user_id,
pm.recipient_id,
pm.id,
pm.text
FROM
private_messages AS pm
WHERE pm.recipient_id=2 OR pm.user_id=2
ORDER BY pm.user_id,pm.recipient_id, pm.id DESC
) AS q
ORDER BY q.id DESC
LIMIT 10;
http://sqlfiddle.com/#!12/4021d/42
你能提供一个你期待的结果输出吗?在上面的例子中,我假设user_id 2只有1条记录,对他来说有最新的消息:'谢谢,好!您?' – Akash 2013-03-24 08:03:47
已添加!感谢您的帮助;)是的你是对的,我只需要这次对话的最后一条消息,+9更多来自其他最新对话的俚语消息... – Gediminas 2013-03-24 11:57:41