Как удалить из select в MySQL?

Этот код не работает для MySQL 5.0, как перезаписать его, чтобы заставить его работать

DELETE FROM posts where id=(SELECT id FROM posts GROUP BY id  HAVING ( COUNT(id) > 1 ))

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

+58
30 дек. '10 в 13:01
источник поделиться
4 ответа

SELECT (sub) запросы возвращают наборы результатов. Поэтому вам нужно использовать IN, а не = в предложении WHERE.

Кроме того, как показано в этом ответе, вы не можете изменить одну и ту же таблицу из подзапроса в том же запросе. Тем не менее, вы можете либо SELECT, либо DELETE в отдельных запросах, либо вложить другой подзапрос и псевдоним результата внутреннего подзапроса (выглядит довольно взломанным):

DELETE FROM posts WHERE id IN (
    SELECT * FROM (
        SELECT id FROM posts GROUP BY id HAVING ( COUNT(id) > 1 )
    ) AS p
)

Или используйте объединения как предложено Mchl.

+138
30 дек. '10 в 13:02
источник

Связанные вопросы


Похожие вопросы

DELETE 
  p1
  FROM posts AS p1 
CROSS JOIN (
  SELECT ID FROM posts GROUP BY id HAVING COUNT(id) > 1
) AS p2
USING (id)
+19
30 дек. '10 в 13:12
источник

вы можете использовать внутреннее соединение:

DELETE 
    ps 
FROM 
    posts ps INNER JOIN 
         (SELECT 
           distinct id 
         FROM 
             posts 
         GROUP BY id  
      HAVING COUNT(id) > 1 ) dubids on dubids.id = ps.id  
+1
31 мар. '17 в 16:43
источник

Если вы хотите удалить все дубликаты, но один из каждого набора дубликатов, это одно из решений:

DELETE posts
FROM posts
LEFT JOIN (
    SELECT id
    FROM posts
    GROUP BY id
    HAVING COUNT(id) = 1

    UNION

    SELECT id
    FROM posts
    GROUP BY id
    HAVING COUNT(id) != 1
) AS duplicate USING (id)
WHERE duplicate.id IS NULL;
-1
10 окт. '13 в 14:02
источник

Посмотрите другие вопросы по меткам или Задайте вопрос