2013-08-08 3 views
0

Я пытаюсь очистить db с повторяющимися записями. Мне нужно переместить ссылку на одну запись и удалить другую.Запрос Mysql с использованием IN с результатом group_concat

У меня есть две таблицы: Промоутеры и объекты, каждая из которых имеет ссылку на таблицу, называемую городами. Проблема в том, что есть города с тем же именем и разными идентификаторами, которые имеют отношение к местам и промоутерам.

С помощью этого запроса можно сгруппировать все промоутеров и места с одного города записи:

SELECT c.id as id, c.name as name, GROUP_CONCAT(DISTINCT p.id) as promoters_ids, GROUP_CONCAT(DISTINCT v.id) as venues_ids 
FROM cities as c 
LEFT JOIN promoters as p ON p.city_id = c.id 
LEFT JOIN venues as v ON v.city_id = c.id 
WHERE c.name IN (SELECT name from cities group by name having count(cities.name) > 1) 
GROUP BY c.name 

Теперь я хочу, чтобы выполнить запрос UPDATE на промоутеров, установив CITY_ID равен результату вышеупомянутого запроса.

Что-то вроде этого:

UPDATE promoters AS pr SET pr.city_id = (
     SELECT ID 
     FROM (
      SELECT c.id as id, c.name as name, GROUP_CONCAT(DISTINCT p.id) as promoters_ids 
      FROM cities as c 
      LEFT JOIN promoters as p ON p.city_id = c.id 

      WHERE c.name IN (SELECT name from cities group by name having count(cities.name) > 1) AND pr.id IN promoters_ids 
      GROUP BY c.name 
      ) AS T1 

    ) 

Как я могу это сделать?

Благодаря

+0

Я не совсем понимаю, какие данные вы хотите де-дублировать? Вы хотите удалить двойные города? – GolezTrol

ответ

3

Если я правильно понимаю, вы хотите, чтобы удалить дубликаты городов (в конце концов), так что вам необходимо обновить промоторы, которые связаны с какой-либо из городов, которые вы хотите удалить, в этом процессе.

Я думаю, что имеет смысл использовать самый низкий идентификатор любого города с тем же именем (может быть и самым высоким, но я хочу указать его по крайней мере, и не оставляйте его для меня .

так, чтобы получить правильный идентификатор для промоутера, мне нужно: Выберите самый низкий идентификатор всех городов, которые имеют такое же имя, как город уже связан с промотором

к счастью, что спрос припадки. зажато в запрос:

UPDATE promoters AS pr 
SET pr.city_id = (
    SELECT 
    -- Select the lowest ID .. 
    Min(c.id) 
    FROM 
    -- .. of all cities .. 
    Cities c 
    -- .. that have the same name .. 
    INNER JOIN Cities pc on pc.Name = c.Name 
    WHERE 
    .. as the city already linked to the promoter being updated 
    pc.id = pr.city_id 
    GROUP BY 
    c.name) 

Трюк состоит в том, чтобы присоединиться к Citi es по себе по имени, так что вы можете легко получить все города с тем же именем. Я думаю, вы попробовали то же самое с предложением IN, но это немного сложнее, чем нужно.

Я не думаю, что вам нужно group_concat вообще, кроме того, если проверенный запрос возвращает правильные города, хотя это не имеет смысла, поскольку вы уже группируете имя. Когда написано, как это, вы можете сказать, что не должно быть так, что это может пойти не так:

SELECT 
    -- Select the lowest ID .. 
    MIN(c.id) AS id, 
    GROUP_CONCAT(c.name) AS names --< already grouped by this, so why... 
    FROM 
    -- .. of all cities .. 
    Cities c 
    -- .. that have the same name. 
    INNER JOIN Cities pc on pc.Name = c.Name 
    GROUP BY 
    c.name 

Я надеюсь, что я правильно понял вопрос.

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