如何使用PHP从MYSQL中选择特定的行?

时间:2019-05-02 05:14:19

标签: php mysql

我有一个聊天应用程序,我正在使用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中最新的日期线之一。任何帮助将不胜感激。谢谢。

3 个答案:

答案 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