2011-07-07 76 views
0

我試圖創建一個查詢,但我遇到了一些麻煩。我有兩個表:PostgreSQL查詢中的挑戰(分組和有問題)

  • 用戶(ID,姓名,電子郵件)
  • 評論(ID,UID,評論,日期,時間)

我想列出所有用戶和他們的評論,這可以通過內部連接很容易地完成。但是,我收到每個用戶的各種評論,因爲我加入了結果。我只想要他們的最新評論。有任何想法嗎? :)

回答

1

對於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 
+0

沒有工作。 :( – JavascriptGOD

+1

@JavascriptGOD:是的,它確實提供了您使用PostgreSQL 8.4+。您使用的是什麼版本,並且您需要提供比「沒有工作」更多的信息 –

+0

很好的窗口函數使用示例。 – plang

0

這可能會實現:

編輯:

我查詢更新到這一點:

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 
+0

沒有子查詢就無法完成這項工作嗎? – JavascriptGOD

+0

我有同樣的問題,唯一的辦法就是用子查詢,也許別人可以提供另一種解決方案,而不需要子查詢 – Taryn

+0

不幸的是,你的工作沒有成功。缺少表c的條目 – JavascriptGOD

0

假設評論的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 
0

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在這個例子中。

2

這應該這樣做:

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 
+0

+1請把upvote這個。與其他RDBMS相比,它使Postgresql大放異彩 –

+0

我不知道Postgresql上的「distinct on」。大! – plang