Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to delete from select in MySQL?

This code doesn't work for MySQL 5.0, how to re-write it to make it work

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

I want to delete columns that dont have unique id. I will add that most of the time its only one id(I tried the in syntax and it doesnt work as well).

like image 525
IAdapter Avatar asked Dec 30 '10 13:12

IAdapter


People also ask

Can we use delete in subquery?

DELETE operations with subqueries that reference the same table object are supported only if all of the following conditions are true: The subquery either returns a single row, or else has no correlated column references. The subquery is in the DELETE statement WHERE clause, using Condition with Subquery syntax.

What is delete query in MySQL?

What is the DELETE Query? MySQL Delete command is used to delete rows that are no longer required from the database tables. It deletes the whole row from the table and returns count of deleted rows. Delete command comes in handy to delete temporary or obsolete data from your database.

How do you delete a query from a table in MySQL?

To remove a table in MySQL, use the DROP TABLE statement. The basic syntax of the command is as follows: DROP [TEMPORARY] TABLE [IF EXISTS] table_name [, table_name] [RESTRICT | CASCADE];


2 Answers

SELECT (sub)queries return result sets. So you need to use IN, not = in your WHERE clause.

Additionally, as shown in this answer you cannot modify the same table from a subquery within the same query. However, you can either SELECT then DELETE in separate queries, or nest another subquery and alias the inner subquery result (looks rather hacky, though):

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

Or use joins as suggested by Mchl.

like image 190
BoltClock Avatar answered Sep 22 '22 20:09

BoltClock


DELETE    p1   FROM posts AS p1  CROSS JOIN (   SELECT ID FROM posts GROUP BY id HAVING COUNT(id) > 1 ) AS p2 USING (id) 
like image 26
Mchl Avatar answered Sep 22 '22 20:09

Mchl