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
的行?
答案 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