2015-12-21 50 views
1

我正在處理有關從兩個MySQL表中選擇數據的問題。PHP MySQL選擇最新的條目按ID分組,並按時間戳排序

First table holds messages | messages | (id, msg_group_id, to_user_id, from_user_id, datetime) 

Second table holds user data | profiles | (user_id, name, firstname, ...) 

ATM它的工作方式,我可以選擇ALL消息具有一定的「to_id」,並通過添加越來越誰發送消息的用戶名和姓連接語句。

我現在的問題是,我不能找出一種方法來只有選擇某個msg_group_id的最新消息。

我已經嘗試過將GROUP BY msg_group_id與ORDER BY datetime DESC結合在一起。

但是,這隻會引發消息表中的第一個條目。但我想要最後一個。 :-)

我希望你能幫助我。 :-)

我實際的SQL語句:

SELECT LEFT(messages.message, 10) AS message, 
`messages`.`msg_group_id`, 
`messages`.`datetime`, 
`profiles`.`name`, 
`profiles`.`firstname` 
FROM `messages` 
LEFT JOIN `profiles` 
ON `messages`.`from_user_id` = `profiles`.`user_id` 
WHERE `to_user_id` = '2' 
ORDER BY `datetime` DESC 
LIMIT 20; 

由於提前

樣本輸入:

[消息]

|id|msg_group_id|to_user_is|from_user_id|message  |datetime| 
0 | 1   | 1  | 2   | Hello World1 | 2015-12-21 10:42:00 
1 | 1   | 1  | 2   | Hello World2 | 2015-12-21 10:43:00 
2 | 1   | 1  | 2   | Hello World3 | 2015-12-21 10:44:00 

【簡況】

user_id|name |firstname| 
1  | Test | User 
2  | Thanks | Worldname 

結果(我不想要什麼)

message|msg_group_id|datetime|name|firstname 
Hello World1 | 1 | 2015-12-21 10:42:00 | Thanks | Worldname 

結果(我想)

message|msg_group_id|datetime|name|firstname 
Hello World3 | 1 | 2015-12-21 10:44:00 | Thanks | Worldname 
+0

謝謝你們糾正我的錯誤格式化;-) – nira

+0

可以添加樣品的輸入和輸出? –

+0

只是增加了一些...但我找不到一種方式來以適當的方式格式化它,我必須將其標記爲代碼? ---哈,至少格式化作品(在某種程度上);-) – nira

回答

0

可能是這個查詢可以幫助:

SELECT m.message, m.msg_group_id, m.datetime, u.name, u.firstname 
FROM message as m, profiles as u 
WHERE m.from_user_id = u.user_id 
GROUP BY m.msg_group_id 
ORDER BY m.datetime DESC 

或者使用INNER JOIN

SELECT m.message, m.msg_group_id, m.datetime, u.name, u.firstname 
FROM message as m 
INNER JOIN profiles as u ON m.from_user_id = u.user_id 
GROUP BY m.msg_group_id 
ORDER BY m.datetime DESC 
+0

如果你想要最新的記錄,那麼只需使用'ORDER BY m.datetime DESC' –

+0

嗨,首先非常感謝你。但它不符合我的期望。 期待一個用戶收到超過1條消息,這將無法正常工作。我猜。 – nira

+0

它應該給你提到的輸出 –

0

我想我解決了這個問題與其他線程的幫助:

https://stackoverflow.com/a/1313140/4493030

我的SQL語句如下:

SELECT `messages`.*, `profiles`.`nick_name` 
FROM `messages` 
LEFT JOIN `profiles` 
ON `messages`.`from_user_id` = `profiles`.`user_id` 
INNER JOIN 
(SELECT konversation_id, MAX(id) AS maxid FROM messages 
WHERE messages.to_user_id = 2 
GROUP BY konversation_id) AS b 
ON messages.id = b.maxid 
WHERE `to_user_id` = '2' 
ORDER BY `datetime` DESC 
LIMIT 20; 

感謝大家誰試圖幫助。

我發現了一種緊下來

SELECT messages.to_user_id, messages.msg_group_id, MAX(messages.id) AS maxid, messages.from_user_id, profiles.name 
FROM messages 
LEFT JOIN profiles 
ON messages.from_user_id = profiles.user_id 
WHERE messages.to_user_id = 2 
GROUP BY msg_group_id