MySQL按结果分组排序

MySQL按结果分组排序,mysql,group-by,sql-order-by,Mysql,Group By,Sql Order By,我有以下表格结构: 表1 表2 表3 我想按模型(来自表2)对我的结果进行分组,并确保它返回最高id(按id降序排列) 我尝试了以下方法,但order by子句似乎不起作用: SELECT a.id, b.model FROM table_1 as a INNER JOIN table_2 as b on b.id = a.id INNER JOIN table_3 as c on c.id = a.id WHERE c.cid = 5 GROUP BY b.model ORDER BY a.i

我有以下表格结构:

表1

表2

表3

我想按模型(来自表2)对我的结果进行分组,并确保它返回最高id(按
id
降序排列)

我尝试了以下方法,但order by子句似乎不起作用:

SELECT a.id, b.model FROM table_1 as a
INNER JOIN table_2 as b on b.id = a.id
INNER JOIN table_3 as c on c.id = a.id
WHERE c.cid = 5
GROUP BY b.model
ORDER BY a.id desc
我做错了什么?

你可以照我说的做

select 
t1.id, 
t2.model 
from table_1 t1 join table_3 t3 on t3.id = t1.id 
join ( 
  select max(id) as id , model from table_2 group by model 
)t2 on t1.id=t2.id 
where t3.cid = 5;
你可以随心所欲

select 
t1.id, 
t2.model 
from table_1 t1 join table_3 t3 on t3.id = t1.id 
join ( 
  select max(id) as id , model from table_2 group by model 
)t2 on t1.id=t2.id 
where t3.cid = 5;
此处演示:

当您最初的尝试没有成功时,这种方法之所以有效,是因为
GROUP BY
子句中不存在的任何字段,或者没有在聚合函数中使用的字段(例如
MAX
),都将具有不确定的值(即mysql引擎不保证您将从组中获得哪个值)

服务器可以从每个组中自由选择任何值,因此,除非它们相同,否则选择的值是不确定的

事实上,MySQL是为数不多(仅有?)的sql数据库之一,它允许您在select子句中放置一个非聚合、非分组字段而不会出错

此处演示:

当您最初的尝试没有成功时,这种方法之所以有效,是因为
GROUP BY
子句中不存在的任何字段,或者没有在聚合函数中使用的字段(例如
MAX
),都将具有不确定的值(即mysql引擎不保证您将从组中获得哪个值)

服务器可以从每个组中自由选择任何值,因此,除非它们相同,否则选择的值是不确定的


事实上,MySQL是为数不多的(仅有的?)sql数据库之一,它允许您在select子句中放置一个未聚合、未分组的字段而不会出错。

put
MAX()
around
a.id
。结果集中
a.id
的选择是不确定的,没有it@MrUpsidown你真的应该把你的输出和错误放在问题中。把
MAX()
放在
a.id
周围。结果集中
a.id
的选择是不确定的,没有it@MrUpsidown你真的应该把你的输出和错误放在问题中。太好了。谢谢!杰出的谢谢!有什么比@pala_uu回答更好?似乎也很好,但我只是想了解这两种方式。谢谢。使用不相关的子查询,您实际上可以获得更多与表相关的匹配列,这在只执行
max
groupby
的情况下是不可能的,有什么比@pala_uuuuu>更好?似乎也很好,但我只是想了解这两种方式。谢谢。使用不相关的子查询,您实际上可以获得更多与表相关的匹配列,这在只执行
max
groupby
的情况下是不可能的
SELECT a.id, b.model FROM table_1 as a
INNER JOIN table_2 as b on b.id = a.id
INNER JOIN table_3 as c on c.id = a.id
WHERE c.cid = 5
GROUP BY b.model
ORDER BY a.id desc
select 
t1.id, 
t2.model 
from table_1 t1 join table_3 t3 on t3.id = t1.id 
join ( 
  select max(id) as id , model from table_2 group by model 
)t2 on t1.id=t2.id 
where t3.cid = 5;
SELECT max(a.id), b.model FROM table_1 as a
INNER JOIN table_2 as b on b.id = a.id
INNER JOIN table_3 as c on c.id = a.id
WHERE c.cid = 5
GROUP BY b.model
ORDER BY max(a.id) desc