0

私はこれらの関係を持っています:

station(station_id、緯度、経度)
station_control_manager(station_id、ctrl_unit_id)

問題

ステーション名、ID、および中心市街地の制御エリアの総数を表にします。たとえば、緯度は 40.750 ~ 40.760、経度は -74.000 ~ -73.95 です。

これは私のクエリです

SELECT DISTINCT s.station_name, s.station_id, count 
FROM station s, 
   (SELECT cm.station_id, COUNT(cm.station_id) as count
    FROM stationcontrolmanager cm GROUP BY cm.station_id) sub_query
WHERE s.latitude >= 40.750 
  AND s.latitude <=40.760 
  AND s.longitude >= -74.000 
  AND s.longitude <= -73.95 
GROUP BY s.station_id;

グループ化station_idして数え、それが何回繰り返されるかを数えます (繰り返すことで、制御領域がいくつあるかがわかります)。

代わりに、私はこれを持っています: ここに画像の説明を入力

カウントは の数であると想定されていましたがctrl_unit_id、この場合は の数でもありstation_idます。しかし、DB では、2 行ではなく 7 行を数えます。

もちろん、駅名はすべて正しいです。

SQL ステートメントに何か問題がありますか?

4

2 に答える 2

2

サブクエリなしでこれを行うことができます:

SELECT station.station_id, station_name, COUNT(ctrl_unit_id)
FROM station
LEFT JOIN station_control_manager ON station.station_id = station_control_manager.station_id
WHERE (latitude BETWEEN 40.750 AND 40.760) AND (longitude BETWEEN -74.000 AND -73.95)
GROUP BY station.station_id, station_name
  1. 両方のテーブルからの情報が必要なため、次を使用してそれらを結合する必要がありますstation_id
  2. ステーションにはコントロール マネージャーがない場合があるため、使用する必要がありますLEFT JOIN(RIGHT JOIN は、対応するコントロール マネージャー レコードがないステーション レコードを削除します)。
  3. ステーションにコントロールユニットが関連付けられていない場合、後者は(まだ)1を返すため、COUNT(ctrl_unit_id)代わりにする必要があります。COUNT(*)
  4. 条項はWHERE自明です
于 2012-05-21T08:05:08.850 に答える
2

これを試して:

SELECT a.station_ID, a.station_name, COUNT(b.station_ID)
FROM station a INNER JOIN station_control_manager b
        on a.station_ID = b.station_ID
WHERE  (a.latitude between 40.75 and 40.76) AND
       (a.longitude between -74.0 and -73.95)
GROUP BY a.station_ID

DISTINCTレコードをグループ化することで、キーワードを省略できるようになりました。

于 2012-05-21T08:08:04.530 に答える