我有一个聊天应用程序,我正在使用PHP从MYSQL获取数据。我不知道如何用最好的方式来表达,所以我将尽我所能来说明它。下面是数据库设置的示例。
数据库
ID MESSAGE DATETIME
------------------------------------------
1 Hello1. 2019-04-23 23:04:31
1 Hello2. 2019-03-23 10:04:31
1 Hello3. 2019-04-26 22:04:31
1 Hello4. 2019-04-23 13:01:10
2 Hello5. 2019-04-09 23:04:31
2 Hello6. 2019-04-23 23:04:31
2 Hello7. 2019-04-12 23:04:12
2 Hello8. 2019-04-11 20:04:31
3 Hello9. 2019-05-18 19:04:29
3 Hello10. 2019-02-22 23:04:31
3 Hello11. 2019-03-25 23:04:30
4 Hello12. 2019-04-23 15:04:31
4 Hello13. 2019-04-10 23:04:31
5 Hello14. 2019-01-14 23:04:31
应该选择
ID MESSAGE DATETIME
------------------------------------------
1 Hello3. 2019-04-26 22:04:31
2 Hello6. 2019-04-23 23:04:31
3 Hello9. 2019-05-18 19:04:29
4 Hello12. 2019-04-23 15:04:31
5 Hello14. 2019-01-14 23:04:31
我想做的是为每个不同的ID选择一次最新的ID。因此,对于ID 1,我只会选择具有最新DATETIME的ID,依此类推。
mysql_query("SELECT * FROM messages WHERE ____?____ ORDER BY __?__");
因此,在这种情况下,应该只有5个结果。每个ID中最新的日期线之一。任何帮助将不胜感激。谢谢。
答案 0 :(得分:4)
您需要MAX(date)
值,但每个ID值一个。因为您还希望该消息出现在GROUP BY
子句中,所以您应该在表上对其自身运行联接。
在联接表中,您可以获得最大日期和ID(按ID分组)-这为每个ID提供了最高日期。在ID和日期上将其联接到表上,这使您可以获取GROUP BY
中不存在的其他列(由于此GROUP BY
在联接表中,因此不需要主表)。
SELECT m.id, m.message, m.date
FROM messages m
JOIN (
SELECT id, MAX(date) AS date
FROM foo
GROUP BY id
) AS t
ON m.id=t.id AND m.date=t.date
答案 1 :(得分:0)
在按ID进行分组之前,您可以尝试在子查询中对它们进行排序,如下所示:
SELECT * FROM (SELECT * FROM messages ORDER BY DATETIME DESC) AS sortedMessages GROUP BY ID;
OR
mysql_query("SELECT * FROM (SELECT * FROM messages ORDER BY DATETIME DESC) AS sortedMessages GROUP BY ID;");
答案 2 :(得分:0)
或者您可以用会话建立第二个表,该行中可以有一个主题和最新消息,然后您将返回完整的表,当打开会话时,您将从消息表中提取单个消息根据对话ID