【问题标题】:MySQL query most recent records from one table but in the order from another tableMySQL 从一个表中查询最近的记录,但按另一表的顺序查询
【发布时间】:2014-02-21 07:24:33
【问题描述】:

对 mysql 真的很陌生。我正在尝试从 table2 查询以显示每个用户的最新登录,但我想按 table1 中的 uid 顺序显示结果。我正在使用从另一个线程中找到的这个查询,但它显示基于时间戳而不是 uid 的结果:

SELECT * 
FROM (SELECT * FROM table2 ORDER BY timestamp DESC) AS x
GROUP BY username

这是我正在寻找的表格和结果:

表1

------------------
| uid | username |
------------------
|  1  | user1    |
------------------
|  2  | user2    |
------------------
|  3  | user3    |
------------------
|  4  | user4    |
------------------

表2

--------------------------------------------
|     timestamp        | username | logins |
--------------------------------------------
| 2014-02-18 23:29:31  | user2    | OUT    |
--------------------------------------------
| 2014-02-18 23:28:31  | user2    | IN     |
--------------------------------------------
| 2014-02-18 23:27:31  | user3    | OUT    |
--------------------------------------------
| 2014-02-18 23:26:31  | user1    | IN     |
--------------------------------------------
| 2014-02-18 23:25:31  | user2    | OUT    |
--------------------------------------------
| 2014-02-18 23:24:31  | user3    | IN     |
--------------------------------------------

我希望得到这样的结果

--------------------------------------------
|  username |      timestamp      | logins |
--------------------------------------------
|  user1    | 2014-02-18 23:26:31 | IN     |
--------------------------------------------
|  user2    | 2014-02-18 23:29:31 | OUT    |
--------------------------------------------
|  user3    | 2014-02-18 23:27:31 | OUT    |
--------------------------------------------
|  user4    | null                | null   |
--------------------------------------------

我希望这已经足够清楚了。提前致谢!

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    试试这个:

    SELECT `table2.username`, `table2.timestamps`, `table2.logins`
    FROM `table2`
    JOIN (
      SELECT MAX(`timestamp`) AS ts, `username`
      FROM `table2`
      GROUP BY `username`
    ) AS `t`
    ON `t.username` = `table2.username` AND `t.ts` = `table2.timestamp`
    RIGHT OUTER JOIN `table1`
    ON `table1.username` = `table2.username`
    ORDER BY `table1.uid`
    

    首先我有一个与派生表t 连接的table2。此派生表获取每个用户的最新时间戳。如果不使用此派生表,则无法获得 login 列的正确值。接下来我做了一个RIGHT JOINtable1 得到uid,所以它可以在ORDER BY 中使用。

    【讨论】:

    • 这也有效,但它没有显示我正在寻找的确切结果,但这是我的错,基于我的问题/表格。此查询仅显示在 table2 中有 logins 事件的用户。我编辑了我的表格以反映我正在寻找的确切结果。对此我深表歉意,并感谢您的帮助。
    • @egglog 在这种情况下,OUTER JOIN 将是必需的。我已经更新了上面的答案,请检查。
    • 它在 username 列下的某些行上显示 null。在第一行,我将 table2.username 更改为 table1.username 并且效果很好。再次感谢您的帮助。
    猜你喜欢
    • 2014-07-05
    • 1970-01-01
    • 1970-01-01
    • 2018-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-07
    相关资源
    最近更新 更多