我有一个包含几百行和一列“颜色”的表格。此列的“颜色”可以是0或1.有时,该列可能会填充更多的1而不是0,反之亦然。我想要的是:返回的表达式,如果有更多的1比0,则SELECT * FROM table WHERE Color = 0
,否则SELECT * FROM table WHERE Color = 1
。我怎样才能做到这一点?根据条件更改过滤器
只是澄清:如果有更多的1比0,我想选择所有的0。否则,相反。
我有一个包含几百行和一列“颜色”的表格。此列的“颜色”可以是0或1.有时,该列可能会填充更多的1而不是0,反之亦然。我想要的是:返回的表达式,如果有更多的1比0,则SELECT * FROM table WHERE Color = 0
,否则SELECT * FROM table WHERE Color = 1
。我怎样才能做到这一点?根据条件更改过滤器
只是澄清:如果有更多的1比0,我想选择所有的0。否则,相反。
您可以使用查询像这样的找出哪些颜色的值是最流行:
SELECT Color FROM `table` GROUP BY Color ORDER BY COUNT(*) DESC LIMIT 1
然后,使用该查询作为您的WHERE
条件的一部分来获得与记录另一种颜色。
SELECT * FROM `table` WHERE Color = 1 - (
SELECT Color FROM `table` GROUP BY Color ORDER BY COUNT(*) DESC LIMIT 1
)
谢谢,非常完美。虽然,你能否澄清我为什么要从内部条款中减去1? – 2014-08-29 03:28:05
子查询获得最流行的(1或0),并且您想要另一个(0代表1,0代表0)。 '1 - ()'是我懒惰的做法。你也可以通过'Color <>'或将子查询顺序从'DESC'改为'ASC' – Dan 2014-08-29 03:30:08
如果'0'和'1'的计数相等会发生什么?也许问题在于OP,就像他们想要什么样的行为一样。如果在平等的时候他们不关心他们是否得到“0”或“1”。 – 2014-08-29 03:53:21
这是你想要的吗?
select (case when sum(color = 0) > sum(color = 1) then 'More 0s'
when sum(color = 0) = sum(color = 1) then 'Same'
else 'More 1s'
end)
from table;
试试这个:
select y.* from yourtable y
inner join
(select color, count(*) count
from yourtable
group by color
order by count desc
limit 1) c on y.color = c.color
我们先计算每个color
计数,然后用最大计数返回color
。然后,我们将color
加入源表中,以获取该color
的所有记录。
@downvoter,请评论 – 2016-09-17 14:19:45