MySQL |Вы не можете указать целевую таблицу 'a' для обновления в предложении FROM - PullRequest
1 голос
/ 15 февраля 2012
DELETE FROM table_a WHERE id IN(
    SELECT table_a.id AS id FROM table_a, table_b 
    WHERE table_a.object_id = 1 AND table_a.code = 'code' 
        AND table_a.code = table_b.code 
        AND table_b.id = table_a.b_id 
        AND table_b.table = 'testTable')

Это (несколько упрощенный) запрос, который я хочу выполнить в MySQL.На других страницах stackoverflow я читал, что это не поддерживается и что это можно решить с помощью JOINS.Как это можно «переписать» на запрос с помощью JOINS?Мне трудно это сделать, потому что я никогда не пытался создавать запросы DELETE с несколькими таблицами.

Ответы [ 4 ]

5 голосов
/ 15 февраля 2012

Вы не можете удалить из таблицы и ссылаться на ту же таблицу в подзапросе & mdash; просто ограничение MySQL. Должно работать что-то вроде следующего:

DELETE FROM table_a 
USING table_a
INNER JOIN table_b
    ON table_a.code = table_b.code
    AND table_b.id = table_a.b_id
    AND table_b.table = 'testTable'
WHERE table_a.object_id = 1 
    AND table_a.code = 'code' 

Важная часть USING. Если вы просто объедините две таблицы, вы удалите записи из обеих. USING говорит MySQL использовать эти таблицы для обработки, но удалять только из таблиц в предложении FROM.

http://dev.mysql.com/doc/refman/5.0/en/delete.html

4 голосов
/ 15 февраля 2012

Это распространенная проблема MySQL, используйте временную таблицу между select и update / delete:

DELETE FROM table_a WHERE id IN 
   (select id from 
       (SELECT table_a.id AS id FROM table_a, table_b 
        WHERE table_a.object_id = 1 
        AND table_a.code = 'code' 
        AND table_a.code = table_b.code 
        AND table_b.id = table_a.b_id 
        AND table_b.table = 'testTable')
    ) tempTable
2 голосов
/ 15 февраля 2012

Существует два (слегка отличающихся) синтаксиса для удаления из таблиц с несколькими таблицами.Вот тот без USING:

DELETE a
FROM 
      table_a AS a 
  INNER JOIN 
      table_b AS b
    ON  b.code = a.code
    AND b.id   = a.b_id   
WHERE 
      a.object_id = 1 
  AND a.code = 'code' 
  AND b.`table` = 'testTable'   --- Do you actually have a column named "table"?
0 голосов
/ 08 февраля 2013

Мой путь ... Если бы ты мог использовать это!

DELETE FROM table_a WHERE id IN(SELECT id FROM(SELECT id FROM table_a WHERE userid=99 GROUP BY mobile HAVING COUNT(mobile) > 1) as t2)
...