2015-12-21 107 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