MySQL INSERT INTO / ON DUPLICATE KEY с проблемой оператора SELECT - PullRequest
1 голос
/ 11 ноября 2009

Привет, я - MySQL Noob. У меня есть таблица с различными списками предприятий, и я пытаюсь заполнить вторую таблицу с названием «города», которая содержит уникальные названия городов и количество записей в каждом городе. Я могу сделать оператор SELECT, который получает мне эти данные, например, так:

SELECT city,state,sum(count)
FROM (
SELECT city,state, 1 AS count FROM listings
) results
GROUP BY city
ORDER BY sum(count) DESC,city;

Тем не менее, теперь я хочу обновить таблицу, но я не могу заставить работать правильное утверждение. Это последнее, что у меня есть, но в настоящее время я получаю сообщение об ошибке «Недопустимое использование групповой функции».

INSERT INTO cities(city,state,size)
SELECT city,state,sum(count)
FROM (
SELECT city,state, 1 AS count FROM listings
) results
ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), size=sum(count); 

Любая помощь приветствуется!

Ответы [ 2 ]

3 голосов
/ 11 ноября 2009

Будет ли что-нибудь столь же простое, как эта работа?

insert into cities (city, state, size)
select city, state, count(*) as size from listings
group by city, state

group by должен гарантировать, что нет дубликатов, поэтому нет необходимости в on duplicate key. Сумма () + подзапрос, который вы выполняли, выглядит так, как будто вы просто пытались сделать подсчет (*).

Конкретная ошибка, которую вы получили, была из-за size = sum (count). В пакетной вставке правильный способ сделать это будет size = values ​​(size), см. Документы по values().

EDIT:

Если он добавляет еще одну запись для каждого города, то для города не существует уникального индекса, и с дубликатом ключа все равно ничего не получится.

если вы добавите уникальный индекс (город, штат), то вы можете добавить on duplicate key update size=values(size) к вышеуказанному запросу, и он будет обновлять каждую запись на месте.

0 голосов
/ 11 ноября 2009

Попробуй это, хотя я хотел бы, чтобы у меня было что-то, чтобы проверить это, прежде чем выпустить это на тебя.

insert into cities (city, state, size)
select city, state, count(*) AS size
from listings
group by city, state
...