【问题标题】:How do I select the latest rows in MySQL?如何在 MySQL 中选择最新的行?
【发布时间】:2011-11-17 16:53:45
【问题描述】:

我想选择 MySQL 中包含 5 个项目的特定表的最新行。 表格如下:

  • id(自动增加)
  • 来自
  • 时间戳
  • 文字

数据是这样的:

|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”或“time stamp”)。 “发件人”可以有很多,但每个相同的“发件人”数据只能出现一次。


无论如何,选择的数据将是:

| 2 | user01 | user02 | 2011-09-02 | text2
| 5 | user01 | user04 | 2011-09-03 | text5
| 6 | user01 | user03 | 2011-09-04 | text6

可以吗? 感谢您花时间阅读我的问题:)

【问题讨论】:

    标签: php mysql select where


    【解决方案1】:
    SELECT * FROM tablename WHERE to = 'user01' ORDER BY timestamp DESC LIMIT 1
    

    ...将为您提供最新条目。

    【讨论】:

    • 我认为,他想为每个 to 和 from 组合获取最新条目。
    • 是的,Alexander Sulfrian 是对的,这个方法我试过了,只能得到“单一”的最新数据,谢谢回复
    【解决方案2】:
    SELECT * FROM `table_name` WHERE `to` = 'user01' ORDER BY `timestamp` DESC LIMIT 0,1
    

    【讨论】:

    • 这仅提供单个数据,我想要的与 to = user01 的用户不同,但仍然感谢您的回复:)
    【解决方案3】:

    我想你在找SELECT DISTINCT user_from FROM table WHERE user_to='user1' ORDER BY id DESC

    DISTINCT 只会为每个 user_from 值返回一行。

    【讨论】:

    • 您的代码有效,我有 3 个数据与用户的 3 个不同,但由于某种原因数据标签为空白,我会继续尝试,感谢您的回复
    • 你可以试试SELECT DISTINCT user_from AS custom_data_title FROM table ....。此外,正如 ypercube 所指出的,您应该避免使用“from”之类的字段名称,因为它是一个关键字 :)
    【解决方案4】:

    一种可能性是这样的:

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

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

    【讨论】:

    • 如果通过idtimestamp 的两个排序相同,这也应该有效。只需在子查询(SELECT MAX(id) FROM tbl WHERE to='user01' GROUP BY to, from) 中添加WHERE to='user01'
    • 哦,我错过了 WHERE... 已编辑。
    【解决方案5】:
    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
                 )
    

    最好避免使用tofromtimestamp 等关键字来命名表和字段。

    【讨论】:

    • 感谢您的回复,您的代码确实有效!多谢!欢呼
    【解决方案6】:

    如果您想要每个唯一 from 用户的最新行:

    SELECT `from`, MAX(`id`), `to` FROM `tablename` WHERE `to`='user01' GROUP BY `from`
    

    (我认为获取 id 的 MAX 可能比时间戳的 MAX 快)

    【讨论】:

    • 您的代码运行良好,但我无法获取文本数据,感谢您的回复:)
    【解决方案7】:

    你可以这样做:

    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]
        )
    

    【讨论】:

    • 您的代码运行良好,但我无法获取文本数据,感谢您的回复:)
    猜你喜欢
    • 1970-01-01
    • 2020-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    • 2022-12-03
    • 1970-01-01
    • 2013-04-03
    相关资源
    最近更新 更多