2017-07-03 14 views
0

MySQLを習得しようとすると、私はHackerrankの問題を解決しています。私は尋ねた、this problemで引っかかってきました:「[...]テーブル内CITYエントリの合計数と、テーブル内の個別CITYエントリの数の違いを見つけるMysql - 2つのクエリによって返される行の数をどのように減算することができますか?

考え方は、単一の回答N' - Nを出力することです。私も他の多くのバリエーションを試してみた

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; 

が、のどれも:

スキーマは次のようになります。このために

enter image description here

、私が試したクエリがあります彼らは私に正しい答えを与えます。どこが間違っていますか?私も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

ええ、あなたは正しいと解釈しました。しかし、あなたのコードを実行しようとすると、ERROR 1140(42000)は5行目です:GROUP BYのない集計クエリでは、SELECTリストの式#1に非集計カラム 's2.total_cities'が含まれています。これはsql_mode = only_full_group_by'と互換性がありません。だから私はそれがtypoだと仮定しました。とにかく、助けてくれてありがとう! –

関連する問題