2017-07-03 43 views
0

試圖學習MySQL,我一直在解決Hackerrank的問題。我被困在this problem,它要求:Mysql - 如何減去2個查詢返回的行數

[...]發現CITY條目表中的總數和不同城市的條目在表上的號碼之間的差值

這個想法是輸出一個答案N' - N

的模式是這樣的:

enter image description here

爲此,我已經試過查詢:

select count(s2.c2) - count(s1.c1) 
from (select city as c1 from station group by city) as s1, 
(select city as c2 from station) as s2; 

我也試過很多其他的變種,但沒有他們給我正確的答案。我哪裏錯了?我也在SO上查詢過其他問題,但他們不返回單個號碼。

謝謝。

回答

1

只需使用count(distinct),並且無需使用自聯接,嘗試以下操作:

select 
    count(city) - count(distinct city) 
from station 
+0

是的......短而甜......這個工程!謝謝! –

1

有這樣做的不同方法。要使用你的方向:

select total_cities - count(distinct_cities) 
from (select count(*) as distinct_cities from station group by city) as s1, 
(select count(*) as total_cities from station) as s2 
GROUP BY total_cities; 

所以第一計數distinct_cities有隻是一個獨特的名單,你也可以使用:

SELECT DISTINCT city AS distinct_cities FROM station 

然後通過計算這些再次計數不同城市的總數外部查詢。希望這可以幫助你思考更多(更短)的寫作方式。

+0

我認爲你的意思'distinct_cities - total_cities'?實際上,它應該是另一種方式,否則我應該在它周圍包裹一個「abs(...)」。好的謝謝。讓我試試這個。 –

+0

我將你的問題解釋爲不同的(即唯一命名的)城市的總數,那麼它就是計數,你最終會得出這個查詢中的單個值。否則它將成爲一個給定城市的計數清單(可以說阿姆斯特丹是清單中的5倍,所以5)減去總數可以說100個城市。然後Londen在列表中3次,減去100次(這個問題在那裏留下了一點點解釋空間) –

+0

是的,你的解釋是正確的。但是當我試圖運行你的代碼時,它表示:錯誤1140(42000)在第5行:在沒有GROUP BY的聚合查詢中,SELECT列表的表達式#1包含非聚集列's2.total_cities';這是與sql_mode = only_full_group_by'不兼容所以我認爲這是一個錯字。無論如何,感謝您的幫助! –