2015-04-01 51 views
0

我有一張名爲photos的表,它擁有數十萬用戶上傳的照片。查詢根據user_id獲取所有最新記錄

每個用戶都可以明顯上傳多張照片。

表架構是:

id, 
user_id, 
photo, 
date_created 

我只想讓每個USER_ID已發佈的最新記錄..

我想:

SELECT * FROM photos 
GROUP BY user_id 
ORDER BY date_created desc LIMIT 300 

但是,這顯然是把回來了很多奇怪的結果。

這似乎是一個簡單的查詢,但我已經做了時間和對堆棧溢出研究和谷歌閱讀這麼多不同的文章時,我不能爲我的生命弄清楚這個簡單的查詢出來。

+0

似乎如果只有一個表,查詢沒有問題。描述你的意思是「奇怪的結果」。 – EternalHour 2015-04-01 01:28:13

回答

0
select p1.user_id, p1.photo, p1.date_created 
    from photos p1 left join photos p2 
    on p1.id < p2.id and p1.user_id = p2.user_id 
    where p2.id is null 

嘗試

編輯 忘記表名,是我不好。添加它。此外,這裏是一個小提琴看到:http://sqlfiddle.com/#!9/a72f6/3

+0

感謝檢查出來,但didnt甚至在所有的工作,mysq說,有一個錯誤 – 2015-04-01 01:13:47

+0

@MichaelMarcus對不起 - 我忘了,包括你的表名。現在它的固定,工作,並有一個例子。 – 2015-04-01 01:50:13

0

檢查了這一點。我用HAVING MAX(date_created)來檢索當前創建/上傳的記錄。

SELECT user_id 
FROM photos 
GROUP BY user_id 
HAVING MAX(date_created) 
ORDER BY date_created DESC LIMIT 300 
+0

好吧這個沒有任何錯誤,但它帶來了非常奇怪的結果,絕對不是每個user_id發佈的最新記錄 – 2015-04-01 01:20:26

+0

你是什麼意思奇怪的結果? – Rigel1121 2015-04-01 01:25:27

+0

對不起,我的意思是它沒有帶回具有獨特的用戶ID,它只是帶回了隨機的結果從表中的最新照片記錄,並且不以任何特定的順序 – 2015-04-01 01:41:10

1

這應該讓你爲每個用戶的最新行:

SELECT p.user_id, photo, date_created FROM photos p 
JOIN (
    SELECT user_id, MAX(date_created) max_date FROM photos GROUP BY user_id 
) max_dates ON p.user_id = max_dates.user_id AND p.date_created = max_dates.max_date 

Sample SQL Fiddle

+0

這一個沒有工作,這布拉夫回隨機的結果,而不是最新的照片用不同的用戶ID – 2015-04-01 01:37:29

+0

@MichaelMarcus真的嗎?這似乎很奇怪在派生表的查詢確定照片被張貼了每個用戶的最新日期和時間是用來過濾。與我的樣本相比,您的餐桌有什麼不同? – jpw 2015-04-01 01:41:17

+0

非常感謝你在這裏和我一起工作,我可能只是難以表達我的問題....但是桌子是一樣的......我能以某種方式給你我的桌子上的記錄嗎? – 2015-04-01 01:43:51

0

我相信你想要的是擺脫GROUP BY和使用常規的「WHERE USER_ID ='東西',其餘部分正確。

我試着像您這樣的查詢,並將結果通過每個「USER_ID」,可以說是唯一的一個記錄。 GROUP BY通常使用WHERE中的一句話...

http://www.w3schools.com/sql/sql_groupby.asp

我希望幫助:)如果你得到一個錯誤,請張貼。