2014-08-29 89 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