Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何按最大值(日期)检索行数据?_Mysql_Sql_Date_Select - Fatal编程技术网

Mysql 如何按最大值(日期)检索行数据?

Mysql 如何按最大值(日期)检索行数据?,mysql,sql,date,select,Mysql,Sql,Date,Select,有一张桌子: +---------+--------+---------------------+----------+ | user_id | marker | date | trans_id | +---------+--------+---------------------+----------+ | 6 | M | 2013-08-27 11:45:24 | 5 | | 6 | MA | 2013-

有一张桌子:

+---------+--------+---------------------+----------+
| 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 |
+---------+--------+---------------------+----------+

+---------+--------+---------------------+----------+
|用户标识|标记|日期|交易标识|
+---------+--------+---------------------+----------+
|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|
+---------+--------+---------------------+----------+
我测试了查询:
选择标记,最大(日期)为最大日期
从mytable
其中用户id=6

但这是不恰当的。 您将如何编写查询?
提前感谢。

这将为您提供每个
用户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
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;

这将为您提供每个
用户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
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;

这将为您提供每个
用户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
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()
一样。这些功能应与
分组依据
结合使用

这将为您提供每个
用户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
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()
一样。这些函数应该与
分组依据

结合使用。我的首选是加入子查询(如果您需要所有条目)


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


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

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;
如果要按最早到最近的日期对用户列表进行排序,则查询为:

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

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

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;
如果要按最早到最近的日期对用户列表进行排序,则查询为:

SELECT * 
FROM mytable 
WHERE (user_id =6)
ORDER BY date DESC;
SELECT * 
FROM mytable 
WHERE (user_id =6)
ORDER BY date ASC;
也有这样的方式

也有这样的方式


试着做这样的事情

SELECT marker , date 
FROM mytable 
WHERE user_id =6
ORDER BY date DESC
LIMIT 1;
不需要join或subselect语句


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

尝试执行类似操作

SELECT marker , date 
FROM mytable 
WHERE user_id =6
ORDER BY date DESC
LIMIT 1;
不需要join或subselect语句


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

那么,如何在没有子查询(JOIN)的情况下获得相同的结果?我想不出任何不使用子查询的方法。这是另一种方法,好的,在第一种情况下,解释显示“使用临时;使用文件排序”,在第二种情况下,我们只有“使用where”。这意味着什么?哪一个问题更好?看看我的答案。。。没有子查询,请求速度比您的快。@Fred you answer仅适用于
1个用户id
,如果OP为每个
用户id
”添加了最新的记录会怎么样?如何在没有子查询的情况下获得相同的结果(JOIN)?我想不出任何不使用子查询的方法。这是另一种方法,好的,在第一种情况下,解释显示“使用临时;使用文件排序”,在第二种情况下,我们只有“使用where”。这意味着什么?哪一个问题更好?看看我的答案。。。没有子查询,请求速度比您的快。@Fred you answer仅适用于
1个用户id
,如果OP为每个
用户id
显示最新记录会怎么样?第一个示例适用于我。请向我解释在当前问题中哪种方式更好:1。在WHERE子句中使用子查询或在“WHERE”中使用JOIN语句对于这个示例子查询是最好的,因为它是一个限制查询。第一个示例适合我。请向我解释在当前问题中哪种方式更好:1。在WHERE子句中使用子查询或在“WHERE”中使用JOIN语句是最好的,因为它是一个限制查询。