2014-08-29 70 views
-1

我有一个包含几百行和一列“颜色”的表格。此列的“颜色”可以是0或1.有时,该列可能会填充更多的1而不是0,反之亦然。我想要的是:返回的表达式,如果有更多的1比0,则SELECT * FROM table WHERE Color = 0,否则SELECT * FROM table WHERE Color = 1。我怎样才能做到这一点?根据条件更改过滤器

只是澄清:如果有更多的1比0,我想选择所有的0。否则,相反。

+0

@downvoter,请评论 – 2016-09-17 14:19:45

回答

2

您可以使用查询像这样的找出哪些颜色的值是最流行:

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 
) 

SqlFiddle

+0

谢谢,非常完美。虽然,你能否澄清我为什么要从内部条款中减去1? – 2014-08-29 03:28:05

+1

子查询获得最流行的(1或0),并且您想要另一个(0代表1,0代表0)。 '1 - ()'是我懒惰的做法。你也可以通过'Color <>'或将子查询顺序从'DESC'改为'ASC' – Dan 2014-08-29 03:30:08

+0

如果'0'和'1'的计数相等会发生什么?也许问题在于OP,就像他们想要什么样的行为一样。如果在平等的时候他们不关心他们是否得到“0”或“1”。 – 2014-08-29 03:53:21

0

这是你想要的吗?

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; 
1

试试这个:

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的所有记录。

SQLFiddle