我試圖創建一個查詢,但我遇到了一些麻煩。我有兩個表:PostgreSQL查詢中的挑戰(分組和有問題)
- 用戶(ID,姓名,電子郵件)
- 評論(ID,UID,評論,日期,時間)
我想列出所有用戶和他們的評論,這可以通過內部連接很容易地完成。但是,我收到每個用戶的各種評論,因爲我加入了結果。我只想要他們的最新評論。有任何想法嗎? :)
我試圖創建一個查詢,但我遇到了一些麻煩。我有兩個表:PostgreSQL查詢中的挑戰(分組和有問題)
我想列出所有用戶和他們的評論,這可以通過內部連接很容易地完成。但是,我收到每個用戶的各種評論,因爲我加入了結果。我只想要他們的最新評論。有任何想法嗎? :)
對於PostgreSQL 8.4+:
SELECT x.*
FROM (SELECT u.*, c.*,
ROW_NUMBER() OVER (PARTITION BY u.id
ORDER BY c.date DESC, c.time DESC) AS rnk
FROM USERS u
JOIN COMMENTS c ON c.uid = u.id) x
WHERE x.rnk = 1
這可能會實現:
編輯:
我查詢更新到這一點:
SELECT u.id, u.name, u.email, t.id, t.uid, t.comment, t.date, t.time
FROM users u
LEFT OUTER JOIN
(
select c.id, m.uid, c.comment, m.cdate, c.time
from comments c
right outer join
(
select uid, max(date) as cdate
from comments
group by uid
) as m
ON c.cdate = m.cdate
) t
ON u.id = t.uid
沒有子查詢就無法完成這項工作嗎? – JavascriptGOD
我有同樣的問題,唯一的辦法就是用子查詢,也許別人可以提供另一種解決方案,而不需要子查詢 – Taryn
不幸的是,你的工作沒有成功。缺少表c的條目 – JavascriptGOD
假設評論的ID是autoincrement,找到最高紀錄每個用戶(最新評論)
SELECT u.id, u.name, u.email, c.id, c.uid, c.comment, c.date, c.time
FROM users u
JOIN comments c ON u.id = c.uid
JOIN
(
select uid, max(id) id
from comments
group by uid
) as c2 ON c.id = c2.id AND c.uid = c2.uid
OMG小馬肯定有最好的答案,但這裏是另一種方式來做到這一點,沒有任何擴展數據庫功能:
select
u.name,
c.comment,
c.comment_date_time
from users as u
left join comments as c
on c.uid = u.id
and
c.comment_date_time -
(
select max(c2.comment_date_time)
from comments as c2
where c2.uid = u.id
) = 0
我有合併的日期和時間列到comment_date_time在這個例子中。
這應該這樣做:
select distinct on(u.name, u.id) *
from comments c, users u
where u.id=c.uid
order by u.name, u.id, c.date desc
+1請把upvote這個。與其他RDBMS相比,它使Postgresql大放異彩 –
我不知道Postgresql上的「distinct on」。大! – plang
沒有工作。 :( – JavascriptGOD
@JavascriptGOD:是的,它確實提供了您使用PostgreSQL 8.4+。您使用的是什麼版本,並且您需要提供比「沒有工作」更多的信息 –
很好的窗口函數使用示例。 – plang