如何在MySQL中选择最新的行?

5
我想在MySQL中选择一个特定表的最新五项。该表的结构如下:
  • id(自动增长)
  • to(收件人)
  • from(发件人)
  • 时间戳
  • 文本
数据大概是这个样子:
|id | to     | from   | time stamp | text
| 1 | user01 | user02 | 2011-09-01 | text1
| 2 | user01 | user02 | 2011-09-02 | text2
| 3 | user02 | user01 | 2011-09-02 | text3
| 4 | user01 | user03 | 2011-09-03 | text4
| 5 | user01 | user04 | 2011-09-03 | text5
| 6 | user01 | user03 | 2011-09-04 | text6
| 7 | user03 | user01 | 2011-09-05 | text7

我想选择 select * WHERE to = 'user01' 并且最新的数据(可能是通过 “id” 或 “时间戳”)。 “from” 可以有很多,但每个相同的 “from” 数据只能出现一次。
无论如何,所选数据将为:
| 2 | user01 | user02 | 2011-09-02 | text2
| 5 | user01 | user04 | 2011-09-03 | text5
| 6 | user01 | user03 | 2011-09-04 | text6

可以做吗? 感谢您抽出时间阅读我的问题 :)
7个回答

4
SELECT t.* 
FROM
      TableX AS t
  JOIN
      ( SELECT DISTINCT `from` AS f
        FROM TableX
        WHERE `to` = 'user01'
      ) AS df
    ON 
      t.id = ( SELECT tt.id
               FROM TableX AS tt
               WHERE tt.`to` = 'user01'
                 AND tt.`from` = df.f
               ORDER BY tt.`timestamp` DESC
               LIMIT 1
             )

最好避免使用像to、from和timestamp等关键词作为表名和字段名。


谢谢回复,你的代码确实有效!非常感谢!干杯 - Chi-Wei Shih

2
SELECT * FROM tablename WHERE to = 'user01' ORDER BY timestamp DESC LIMIT 1

这将为您提供最新的条目。


我认为他想要获取每个起点和终点组合的最新条目。 - Alexander Sulfrian
是的,Alexander Sulfrian 是正确的,我尝试过这种方法,它只会获取“单个”最新数据,谢谢回复。 - Chi-Wei Shih

2

我认为你想要的是 SELECT DISTINCT user_from FROM table WHERE user_to='user1' ORDER BY id DESC

DISTINCT 只会返回每个 user_from 值的一行结果。


你的代码是有效的,我得到了3个数据,与用户的三个不同,但由于某些原因,数据标签为空白,我会继续努力,谢谢回复。 - Chi-Wei Shih
你可以尝试使用 SELECT DISTINCT user_from AS custom_data_title FROM table ....。另外,正如ypercube所指出的那样,你应该避免使用像"from"这样的字段名,因为它是一个关键字 :) - florian h

1

一个可能的选项是这样的:

SELECT * FROM tbl WHERE id IN (
    SELECT MAX(id) FROM tbl
    WHERE to = 'user01'
    GROUP BY from
);

但我不知道它是否符合您的要求,即每个“from”只能出现一次。


如果通过 idtimestamp 两种排序方式得到的结果相同,这个方法也可以奏效。只需要在子查询 (SELECT MAX(id) FROM tbl WHERE to='user01' GROUP BY to, from) 中添加 WHERE to='user01' 即可。 - ypercubeᵀᴹ
哦,我错过了 WHERE... 已编辑。 - Alexander Sulfrian

1
如果您想获取每个唯一from用户的最新行:
SELECT `from`, MAX(`id`), `to` FROM `tablename` WHERE `to`='user01' GROUP BY `from`

我认为获取id的最大值可能比时间戳的最大值更快。


你的代码工作得很好,但是我无法获取文本数据,谢谢回复 :) - Chi-Wei Shih

1
你可以这样做:
SELECT to, from, max(timestamp) FROM <table> WHERE to = 'user01' GROUP BY from

要获取相关的文本,你也可以这样做,但这并不是很高效。

SELECT * FROM <table> 
WHERE 
    CONCAT([to], [from], [timestamp]) 
    IN 
    (
     SELECT CONCAT([to], [from], MAX([timestamp])) FROM <table> 
     WHERE [to] = 'user01' GROUP BY [from]
    )

你的代码运行得很好,但我无法获取文本数据,谢谢回复 :) - Chi-Wei Shih

-1
SELECT * FROM `table_name` WHERE `to` = 'user01' ORDER BY `timestamp` DESC LIMIT 0,1

这只提供单个数据,我想要的与to = user01的用户不同,但还是谢谢您的回复 :) - Chi-Wei Shih

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接