【问题标题】:How to retrieve row data by MAX(date)?如何按 MAX(date) 检索行数据?
【发布时间】:2013-08-27 08:05:35
【问题描述】:

有一张桌子:


+---------+--------+---------------------+----------+
| user_id | marker | date                | trans_id |
+---------+--------+---------------------+----------+
|       6 | M      | 2013-08-27 11:45:24 |        5 |
|       6 | MA     | 2013-08-27 11:45:42 |        6 |
|       6 | A      | 2013-08-27 11:45:59 |        7 |
+---------+--------+---------------------+----------+
我测试了查询:
SELECT marker , MAX(date) AS maxdate FROM mytable WHERE user_id =6
但这是不正确的。 您将如何编写查询? 提前致谢。

【问题讨论】:

    标签: mysql sql date select


    【解决方案1】:

    这将为您提供每个user_id 的最新记录

    SELECT  a.*
    FROM    tableName a
            INNER JOIN
            (
                SELECT  user_id , MAX(date) date
                FROM    tableName
                GROUP   BY user_ID
            ) b ON a.user_id = b.user_id AND
                    a.date = b.date
    -- WHERE    a.user_id = 6         ==> if you want for specific user_id only
    

    【讨论】:

    • 如果没有子查询(JOIN),如何获得相同的结果?
    • 如果不使用子查询,我想不出任何办法。这是另一种方法,sqlfiddle.com/#!2/1351d9/5
    • 好的,在第一种情况下,解释向我们显示“使用临时;使用文件排序”,而在第二种情况下,我们只有“使用位置”。那是什么意思?哪个查询更好?
    • 看我的回答...没有子查询,请求比你的快。
    • @Fred 您的回答仅适用于 1 user_id,如果 OP 的每个 user_id 的最新记录是什么?
    【解决方案2】:

    这将为您提供每个user_id 的最新记录

    SELECT
      a.user_id,
      b.marker,
      MAX(a.date) AS maxdate,
      b.trans_id
    FROM TableName a
    JOIN TableName b
      ON b.date = a.date AND a.user_id = b.user_id
    GROUP BY a.user_id
    ORDER BY a.date DESC;
    

    MAX() 是一个聚合函数,就像SUM()COUNT() 一样。这些功能应与GROUP BY结合使用。

    【讨论】:

      【解决方案3】:

      这取决于你想要什么。如果您想在表中包含最近的行,则查询是:

      SELECT *  
      FROM mytable 
      WHERE (user_id =6 AND date =(SELECT MAX(date) FROM mytable));
      

      如果您想让用户列表按从最新到最旧的日期排序,查询是:

      SELECT * 
      FROM mytable 
      WHERE (user_id =6)
      ORDER BY date DESC;
      

      如果你想让用户列表按从最旧到最近的日期排序,查询是:

      SELECT * 
      FROM mytable 
      WHERE (user_id =6)
      ORDER BY date ASC;
      

      【讨论】:

      • 第一个例子适合我。请向我解释在当前问题中哪种方式更好:1.在 WHERE 子句中使用子查询或使用 JOIN 语句
      • 对于这个例子,“WHERE”中的子查询是最好的,因为它是一个限制查询。
      【解决方案4】:

      我的偏好是加入子查询(如果您需要所有条目)

      SELECT 
          marker, user_id, maxDate.date AS maxdate
      FROM
          mytable as t1 join
          (select max(date) as date
          from mytable as t2
          where t2.user_id = 6
          group by user_id) as maxDate
      WHERE
          user_id = 6
      

      【讨论】:

        【解决方案5】:

        也有这种方式http://sqlfiddle.com/#!2/8d707/4

        SELECT
        user_id,
        marker,
        date,
        trans_id
        FROM TableName
        where user_id=6
        having date = (select max(date) from TableName where user_id=6)
        limit 1
        

        【讨论】:

          【解决方案6】:

          尝试做这样的事情。

          SELECT marker , date 
          FROM mytable 
          WHERE user_id =6
          ORDER BY date DESC
          LIMIT 1;
          

          无需加入或子选择语句。

          order by 子句会按日期对结果进行排序,然后 limit 子句只会选择第一行。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-09-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多