2009-08-01 3 views
23

Получил 2 таблицы/сущности, очень простой сценарий.MySQL: подсчет записей из одной таблицы, а затем обновление другой

Таблица поэты - Столбцы: идентификатор, поэт, нация

Таблица страны - Рубрики: идентификатор, нация, сосчитать

В основном народы к поэтов есть отображение одного для многих, естественно. Например, есть 1000 поэтов из 60 стран. Каждый поэт в поэтов присваивается нации национальным полом, в котором содержится идентификатор одной из наций в народах.

Отсчет поле народов содержит ряд поэтов в поэтов из этой страны.

Мой вопрос заключается в том, как использовать только один SQL-запрос, чтобы подсчитать количество поэтов нации в поэтах, а затем обновить соответствующий счет этой нации?

Я пробовал:

UPDATE poets, nations SET nations.count = COUNT(poets.id) GROUP BY poets.nation HAVING poets.nation = nations.id 

Но это дает # 1064 ошибку. Также попытался объединить предложение WHERE где-то, но он все еще отказывается работать.

Любая идея?

ответ

32

Использование подзапроса:

UPDATE nations 
    SET count = (
     SELECT COUNT(id) 
     FROM poets 
     WHERE poets.nation = nations.id 
     GROUP BY id 
     ); 
+0

Спасибо, что работает трюк! –

+6

обратите внимание, что для очень больших таблиц (500000+ записей) это может быть очень медленным. – dusoft

+0

Кроме того, если country.count не имеет значения NULL, это может привести к предупреждению. Используйте IFNULL для защиты от этого. UPDATE countries SET count = IFNULL ((SELECT COUNT (id) FROM poets WHERE poets.nation = countries.id GROUP BY id), 0); –

18

Вам просто не нужно GROUP BY, ср .:

UPDATE nations SET count = (
    SELECT COUNT(id) FROM poets 
    WHERE poets.nation = nations.id); 

Или, скорее, с GROUP BY, подзапрос вернет NULL для стран, которые имеют не поэты. Без GROUP BY подзапрос в этом случае возвращает 0.

+0

null/0 разница с/без группы по - это помог. Спасибо –

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