2009-08-24 9 views
0

少なくとも50の場所を持つ場所だけを取得できるようにクエリを作成したいと思います。SQLの計算に関する質問

私は場所のテーブルを持っている:

Id, City, Country 
1, Austin, USA 
2, Paris, France 

そしてLOCATION_ID

Id, Name, Details, Location_id 
1, The Zoo, blah, 2 
2, Big Park, blah, 2 

によって場所に接続されている場所のテーブル私はそうのようにそれらを結合することができます。

SELECT places.name 、places.id、locations.country、locations.city 場所から INNER JOINの場所 ON places.location _id = locations.id

どのようにすれば、少なくとも50か所以上の都市の結果を取得し、最大額で注文することができますか?

ありがとうございます!

答えて

3

はOK、私は上記の答えがほとんど存在していることを見てきましたが、いくつかのミスを持っています:

SELECT locations.country, locations.city, COUNT(*) as count_of_places 
FROM places 
    INNER JOIN locations ON places.location_id = locations.id 
GROUP BY locations.country, locations.city 
HAVING COUNT(*) >= 50 
ORDER BY count_of_places; 
+1

実際に動作するクエリを持つ唯一のものではない場合は、+1 。 –

+0

注文は、実際には最低金額で始まります。それはDESCであるべきですか? –

4

GROUP BY with a HAVING節を使用してください。

SELECT locations.country, locations.city, COUNT(*) 
FROM places 
    INNER JOIN locations ON places.location_id = locations.id 
GROUP BY locations.country, locations.city 
HAVING COUNT(*) >= 50 
+1

ちょうど ... COUNT(*)count_of_places などを逃す... count_of_places DESC –

+1

BY ORDERは、問題は*場所によってグループ化した後、あなたは適切な '回数を(持っているつもりはないということです) 'である。 –

+0

これがうまくいくかどうかわかりません。places.idでグループ化していますが(場所のID列が一意のキーであると仮定すると)、これはすべてのグループにメンバーが1つあることを意味します。 – Martijn

0

ややunperformantが、動作するはずです:SQ は(sq.id = ONの場所を結合として

SELECT places.name, places.id, sq.country, sq.city, sq.counter FROM (SELECT Locations.id, country,city, count(*) as counter FROM Locations JOIN Places ON (Locations.Id=Places.Location_id) GROUP BY)は、COUNT(*)> = 50を備えたlocations.id場所。場所ID) 注文書カウンタDESC`

PS正確な構文はデータベースによって異なる場合がありますが、これがmysqlと互換性があるかどうかはわかりません。

1

having句を使用して、これらの行を集約列の値で制限することができます。また、MySQLはあなたが怠惰group by Sを使用することができますので、あなたは絶対にこれを利用することができますので、ちょうど正しいバージョンを掲示、

select 
    l.country, 
    l.city, 
    p.name, 
    p.details, 
    count(*) as number_of_places 
from 
    locations l 
    inner join places p on 
     l.id = p.location_id 
group by 
    l.id 
having 
    count(*) >= 50 
order by 
    number_of_places, 
    l.country, 
    l.city, 
    p.name 
+0

これはコンパイルされません。SELECTの集約関数の外にあるものはGROUP BYにする必要があります。 –

+0

@andrew:MySQLではありません。 SQL Serverでは、それが行います。これはMySQLの "怠惰な"グループの意味です。華麗な、ええ? – Eric

関連する問題