0

我有这些关系:

station(station_id, 纬度, 经度)
station_control_manager(station_id, ctrl_unit_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 中,我数的是 7 行,而不是 2 行。

当然,站名都是正确的。

我的 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. 您需要COUNT(ctrl_unit_id)代替,COUNT(*)因为当站没有与之关联的控制单元时,后者将(仍然)返回 1。
  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 回答