2015-02-23 50 views
0

。我正在使用Postgres並試圖查詢用戶查看的最後15個客戶端。SQL上一列不同與我有麻煩此查詢正確的兩個表

client
id, name ...

impressions
imressionable_id, user_id, created_at ...

的impressionable_id等於CLIENT_ID以及表可以在該字段被接合。

我需要讓用戶查看過去的15個不同的客戶名稱的列表,並下令DESC由created_at日期。問題是目前對印象表的查詢會生成許多重複的條目,但具有唯一的created_at時間戳,因爲每次查看客戶端時都會創建新的印象記錄。

所以,

select impressions.impressionable_id, created_at from impressions where user_id = 1 order by created_at DESC 

查詢會產生:

impressionable_id created_at 
     1   2014-11-14 21:44:47.705167 
     1   2014-11-14 21:32:15.411488 
     3   2014-11-14 18:43:26.020719 
     1   2014-11-14 18:42:15.974442 
     5   2014-11-14 18:41:10.609617 
     3   2014-10-29 20:53:01.383896 

我需要一個查詢,這將使我:

1 John Doe  2014-11-14 21:44:47.705167 
3 Jay Smith 2014-11-14 18:43:26.020719 
5 Tim Jones 2014-11-14 18:41:10.609617 

等。任何幫助是極大的讚賞!

+0

'通過impressionable_id'選擇MAX(created_at)....組? – 2015-02-23 21:04:28

回答

1

使用MAX()GROUP BY

select I.impressionable_id,c.name, MAX(I.created_at) as created_at 
from impressions JOIN 
    client c ON c.id = I.user_id 
group by impressionable_id,c.name 
order by created_at DESC 
limit 15; 
+0

謝謝,但這只是從一個表中獲取記錄。 – RKRaider 2015-02-24 01:05:50

+0

@RKRaider:那是因爲我不知道你的表格結構。現在我已經用一個連接更新了我的答案。 – 2015-02-24 05:11:13

+0

這是我的工作解決方案,其中的聯合條款略有異常,位於I.impressionable_id而非user_id。然後我爲user_id添加了where子句。 – RKRaider 2015-02-24 20:21:11

1
SELECT y.* FROM 
(
    SELECT 
     DISTINCT ON (x.id) x.id, x.name, x.created_at 
    FROM (SELECT c.id, c.name, i.created_at FROM clients c RIGHT JOIN impressions i ON c.id = i.user_id) x 
) y 
ORDER BY y.created_at DESC LIMIT 15; 
+0

我這就給了答案,因爲我是能夠解決它添加的修補程序:c.id = i.impressionable_id其中 i.user_id = 1代替c.id = i.user_id的。 – RKRaider 2015-02-24 01:07:11

+0

經過認真測試這個工程上的第一條記錄才把它沒有得到最新的記錄下一個客戶端ID。 – RKRaider 2015-02-24 20:20:03

+0

@RKRaider檢查截圖:[http://i.gyazo.com/bf4e470fbac69e330810ca5e5f7c9945.png](http://i.gyazo.com/bf4e470fbac69e330810ca5e5f7c9945.png)我創建兩個表和運行查詢。你是否錯過了一些說不能正常工作的東西? – jurgen 2015-02-26 07:12:46