Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.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 同时使用ORDER BY和GROUP BY_Mysql_Sql_Group By_Greatest N Per Group - Fatal编程技术网

Mysql 同时使用ORDER BY和GROUP BY

Mysql 同时使用ORDER BY和GROUP BY,mysql,sql,group-by,greatest-n-per-group,Mysql,Sql,Group By,Greatest N Per Group,我的表如下所示,我正在使用MySQL: m_id | v_id | timestamp ------------------------ 6 | 1 | 1333635317 34 | 1 | 1333635323 34 | 1 | 1333635336 6 | 1 | 1333635343 6 | 1 | 1333635349 我的目标是将每个m_id取一次,然后按最高的时间戳排序 结果应该是: m_id | v_id | timest

我的表如下所示,我正在使用MySQL:

m_id | v_id | timestamp
------------------------
6    |   1  | 1333635317
34   |   1  | 1333635323
34   |   1  | 1333635336
6    |   1  | 1333635343
6    |   1  | 1333635349
我的目标是将每个m_id取一次,然后按最高的时间戳排序

结果应该是:

m_id | v_id | timestamp
------------------------
6    |   1  | 1333635343
34   |   1  | 1333635336
我写了这个查询:

SELECT * FROM table GROUP BY m_id ORDER BY timestamp DESC
但是,结果是:

m_id | v_id | timestamp
------------------------
34   |   1  | 1333635323
6    |   1  | 1333635317
我认为这是因为它首先分组,然后排序结果


有什么想法吗?谢谢。

正确使用group by的一种方法:

工作原理:

为子查询中的每个不同m_id选择最新的时间戳 仅从表中选择与子查询中的行相匹配的行。如果执行了联接,但未从第二个表中选择任何列,则此操作仅用作筛选器,以防您好奇 点菜
如果你真的不在乎你会得到哪个时间戳,并且你的v_id对于给定的m_i总是相同的,你可以做以下事情:

select m_id, v_id, max(timestamp) from table
group by m_id, v_id
order by timestamp desc
现在,如果给定m_id的v_id发生变化,那么您应该执行以下操作

select t1.* from table t1
left join table t2 on t1.m_id = t2.m_id and t1.timestamp < t2.timestamp
where t2.timestamp is null
order by t1.timestamp desc
SQL>

选择面试.qtrcode QTR,面试.companyname公司名称,面试.division部门 来自采访 加入工作单位 在面试时,companyname=employer.companyname和employer.zipcode类似“100%” 按访谈分组.qtrcode,访谈.companyname,访谈.division 通过访谈订购。qtrcode; 你可以试试这个

 SELECT tbl.* FROM (SELECT * FROM table ORDER BY timestamp DESC) as tbl
 GROUP BY tbl.m_id  

你只需要跟asc描述一下。按如下所示编写查询。它将按升序返回值

SELECT * FROM table GROUP BY m_id ORDER BY m_id asc;

这是最简单的解决方案

select m_id,v_id,max(timestamp) from table group by m_id;

按m_id分组,但为每个m_id获取最大时间戳。

为什么这么复杂?这起作用了

SELECT m_id,v_id,MAX(TIMESTAMP) AS TIME
 FROM table_name 
 GROUP BY m_id

使用MAX从groupby子句中选择MAX,该子句没有聚合函数,例如:COUNT、SUM、MAX毫无意义。MySQL甚至允许这样做,这让我感到困惑。想想看,如果你不对组做任何事情,为什么要分组?在MySQL的早期版本中,对组的内容进行排序是一个错误。从SQL标准开始,在这种情况下,ORDER BY必须只影响GROUP BY的结果,而不影响分组前的数据。@NullUserException-不带聚合函数的GROUP BY的正确用法是按主键分组。当您的连接产生1时非常有用:许多选择a.id、a.name、a.age、MAXb.savings从a.id=b上的内部连接b中进行。id@NullUserException当使用查找表进行多对多连接时,它允许回退。非常感谢,它工作得很好。你能解释一下这个“r”是什么吗?是临时桌吗?它如何调用SQL?@luis-假设子查询是一个视图;直列视图。它需要一个名称,以便您可以引用它及其字段。这个答案给在线视图命名为r。您可以随意调用它。@Luis这是一个别名,您可以通过它引用子查询。我也可以写选择。。。正如r所指出的那样,as更清楚地说明了这一点。它工作得很完美,但内部join语句缺少clausethanks@MattFenwick中的一个,它对我有效,而你节省了我的时间,但这不起作用。虽然它会反转结果,但仍然不会返回所需的结果。
SELECT m_id,v_id,MAX(TIMESTAMP) AS TIME
 FROM table_name 
 GROUP BY m_id