如何通过在另一个之前选择一个值来制作MySQL组?

时间:2016-01-14 10:13:29

标签: mysql group-by

size   color    in_stock
-----  -----   -----
small   red       0
large   red       1
xlarge  red       1

当我使用GROUP BY size,color时,第二行选择in_stock 0的第一行。有没有办法让GROUP BY始终优先考虑in_stock 1而不是in_stock 0的行?

3 个答案:

答案 0 :(得分:2)

简短的回答是:否

我怀疑(因为你不提供原始查询)你正在使用这样的东西:

SELECT size,color, in_stock
FROM atable
GROUP BY size,color

MySQL允许GROUP BY子句只有几个非聚合列 - 但它只能通过服务器设置来实现

请参阅:http://dev.mysql.com/doc/refman/5.0/en/group-by-handling.html

如果你使用这个"功能"无法控制在其他非聚合列中选择的数据。

你不应该使用这个"功能" MySQL,因为如果服务器设置关闭此扩展,您的查询将不再有效。

你可以这样做:

SELECT size,color, MIN(case when in_stock = 1 then in_stock else NULL end)
FROM atable
GROUP BY size,color

答案 1 :(得分:0)

您可以按照以下语法使用

select size, color, in_stock, ....other fields...
from yourtable 
where ...conditions if any....
group by size,color 
order by in_stock desc;

按顺序总是按顺序排序,所以如果你想先订购然后分组。你可以使用以下查询 -

select size, color, in_stock
from 
(
select size, color, in_stock, ....other fields...
from yourtable 
where ...conditions if any....
order by in_stock desc
) as a
group by size,color;

答案 2 :(得分:0)

如果您是GROUP BY列并且还返回不在GROUP BY子句中的非聚合列,那么未定义从哪个列获取列值。它可能是第一个,也可能是最后一个。它可能会根据存储引擎或其他任何内容而改变。

如果您特别想要第二个,您可以这样做: -

SELECT size, color, SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(in_stock ORDER BY FIELD(size, 'small', 'large', 'xlarge')), ',', 2), ',', -1)
FROM atable
GROUP BY size,color