【问题标题】:MySQL select all rows having latest value per idMySQL选择每个id具有最新值的所有行
【发布时间】:2016-01-30 13:13:46
【问题描述】:

我的表格如下所示:

| id | user | data |
--------------------
| 1  |  11  | aaa1 |
| 2  |  11  | aaa2 |
| 3  |  11  | aaa3 |
| 4  |  22  | aaa4 |
| 5  |  33  | aaa5 |
| 6  |  33  | aaa6 |
| 7  |  44  | aaa7 |

我想选择包含所有数据的所有行,并且我想通过user 添加带有max id 的数据,应该如下所示:

| id | user | data | f_id | f_data |
------------------------------------
| 1  |  11  | aaa1 |   3  |  aaa3  |
| 2  |  11  | aaa2 |   3  |  aaa3  |
| 3  |  11  | aaa3 |   3  |  aaa3  |
| 4  |  22  | aaa4 |   4  |  aaa4  |
| 5  |  33  | aaa5 |   6  |  aaa6  |
| 6  |  33  | aaa6 |   6  |  aaa6  |
| 7  |  44  | aaa7 |   7  |  aaa7  |

这是我的查询尝试:

SELECT  t1.*, t2.id AS f_id, t2.data AS f_data
        FROM table1 t1
        LEFT JOIN table1 t2
             ON t1.user=(SELECT MAX(t2.id)
                         FROM table1 t2
                         WHERE t2.user = t1.user )

更新: 所有答案都是正确的,但是当我在 80K+ 行的表上运行查询时,MySQL 需要大量时间来执行查询。对于我的项目,我将添加 ajax,以便用户单击它,php 将执行每次单击一行的查询。

【问题讨论】:

  • 您的查询有什么问题?
  • 我不得不说为什么,将data 复制到f_data 并像这样创建f_id 似乎没有多大意义,因为它几乎肯定会被弄乱未来起来。重新审视您的数据库设计
  • 它在f_id 和f_data 中给出null。

标签: mysql sql join max


【解决方案1】:

SQL Fiddle Demo

SELECT  t1.*, 
        t2.id AS f_id, 
        t2.data AS f_data
FROM table1 t1
JOIN table1 t2
  ON t1.user = t2.user
 AND t2.id = (SELECT MAX(t2.id)
              FROM table1 t3
              WHERE t3.user = t1.user)

【讨论】:

    【解决方案2】:

    您可以使用您的逻辑来解决此问题。只需要解决一些问题:

    SELECT t1.*, t2max.id AS f_id, t2max.data AS f_data
    FROM table1 t1 JOIN
         table1 t2max
         ON t1.user = t2max.user AND
            t2max.id = (SELECT MAX(t2.id)
                        FROM table1 t2
                        WHERE t2.user = t1.user
                       );
    

    变化如下:

    • 您需要在FROM 子句中的两个表之间为用户设置一个条件。
    • 子查询需要加入id 而不是user。

    【讨论】:

      【解决方案3】:

      这样就可以了。

      SELECT  t1.*, t3.id AS f_id, concat(SUBSTRING(t1.data, 1, CHAR_LENGTH(t1.data)-1),t3.id) AS f_data
              FROM table1 t1
              INNER JOIN (select max(t2.id) as id, t2.user as userid from table1 t2 group by t2.user) t3
              on t3.userid = t1.user
      

      Sqlfiddle:http://sqlfiddle.com/#!9/a24413/7

      【讨论】:

        猜你喜欢
        • 2021-07-23
        • 2016-01-21
        • 1970-01-01
        • 2019-12-07
        • 2021-08-10
        • 2019-10-03
        • 1970-01-01
        • 2021-07-30
        • 2019-12-19
        相关资源
        最近更新 更多