2012-05-21 4 views
0

У меня есть эти отношения:COUNT запрос в MYSQL

station (station_id, широта, долгота)
station_control_manager (station_id, ctrl_unit_id)

Проблема

имена Tabulate станции, идентификаторы и общее количество контрольных зон в средней части города, , например, широта между 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 и подсчитать, сколько раз она повторяется (по repating, мы знаем, сколько диспетчерский центр имеет).

Вместо этого, у меня есть это: enter image description here

Граф должен был быть число ctrl_unit_id, которое в данном случае является также количество station_id. Но в БД я считаю 7 строк, а не 2.

Названия станций все правильно, конечно.

Есть что-то не так с моими операторами SQL?

+1

Вам нужно сообщить MySQL, как 'sub_query' присоединяется к вашей таблице' station': например. добавьте 'AND s.station_id = sub_query.station_id' в предложение' WHERE'. – eggyal

+0

@eggyal Вы правы в этом. Но зачем это нужно? Я добавляю подзапрос в других моих запросах. Не возражаете ли вы объяснить, когда у вас есть время? Благодарю. – user1012451

+1

Без этого вы выполняете полное декартовое перекрестное соединение между 'sub_query' и' station' - то есть будет результирующая строка для каждой строки в 'sub_query', соединенной с каждой строкой в' station'. Читайте в [SQL joins] (http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html). – eggyal

ответ

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(*), поскольку последний будет (до сих пор) return 1, когда станция не имеет связанного с ней блока управления.
  4. WHERE положение само за себя
+0

Большое спасибо. Ясно. Я не очень хорошо знаком с 'JOIN', и я знаю, что это отличный инструмент для использования.Мне нравится то, что вы делали. Я пытаюсь изменить свой запрос, чтобы сообщить итоговый счет. – user1012451

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 

Группировка записей, теперь OK, чтобы опустить DISTINCT ключевое слово.

+0

Большое спасибо. Вы представляете очень хорошее решение. Я сохраню это как ссылку. Позвольте мне сначала попытаться изменить мою. – user1012451

Смежные вопросы