MySQL удалить записи из 2 таблиц - PullRequest
3 голосов
/ 08 июля 2010

Я хочу удалить информацию из двух разных таблиц в одном запросе на основе идентификатора.

Я попробовал несколько решений здесь, чтобы выполнить эту задачу, но все еще не выполнил то, что я пытаюсь сделать.

Таблица 1 - Содержание

---------- ---------
 ContentID | Content
--------------------

Таблица 2 - Голоса

---------------------------
 VoteID | ContentID | Vote 
---------------------------

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

Что здесь лучше - ЛЕВОЕ СОЕДИНЕНИЕ? ВНУТРЕННИЙ РЕЙТИНГ?

Любая помощь здесь будет принята с благодарностью.

Ответы [ 5 ]

8 голосов
/ 08 июля 2010
DELETE Content, Votes
FROM Content
LEFT JOIN Votes
ON Votes.ContentID = Content.ContentID
WHERE Content.ContentID = ?
2 голосов
/ 08 июля 2010

Если у вас есть отношение, вы можете попробовать эту опцию ON DELETE CASCADE .

Другой вариант - создать хранимую процедуру и выполнить удаление в 2 этапа, но только с одним сервером.звоните.

1 голос
/ 08 июля 2010

Вы можете указать несколько таблиц в операторе DELETE, чтобы удалить строки из одной или нескольких таблиц в зависимости от конкретного условия в предложении WHERE.Однако вы не можете использовать ORDER BY или LIMIT в DELETE для нескольких таблиц.Предложение table_references перечисляет таблицы, участвующие в объединении.Его синтаксис описан в Разделе 12.2.7.1, «Синтаксис JOIN».

Первый синтаксис DELETE для нескольких таблиц поддерживается начиная с MySQL 4.0.0.Второй поддерживается начиная с MySQL 4.0.2.

Для первого синтаксиса с несколькими таблицами удаляются только совпадающие строки из таблиц, перечисленных до предложения FROM.Для второго синтаксиса с несколькими таблицами удаляются только совпадающие строки из таблиц, перечисленных в предложении FROM (до предложения USING).В результате вы можете удалять строки из нескольких таблиц одновременно и иметь дополнительные таблицы, которые используются только для поиска:

DELETE t1, t2 FROM t1 INNER JOIN t2 INNER JOIN t3 WHERE t1.id=t2.id AND t2.id=t3.id;

Или:

DELETE FROM t1, t2 USING t1 INNER JOIN t2 INNER JOIN t3 WHERE t1.id=t2.id AND t2.id=t3.id;

Эти операторы используют все три таблицы при поиске строк для удаления, но удаляют совпадающие строки только из таблиц t1 и t2.

Эта ссылка может быть полезной "http://dev.mysql.com/doc/refman/4.1/en/delete.html"

1 голос
/ 08 июля 2010
DELETE t1, t2 FROM t1 INNER JOIN t2 INNER JOIN t3
WHERE t1.id=t2.id AND t2.id=t3.id;

Хотя это для 3 столов, я уверен, что вы сможете адаптировать его к вашим потребностям.

0 голосов
/ 09 апреля 2014

Без использования «JOINS» самое простое, что я мог придумать, пока искал решение, было DELETE a.*,b.* FROM table1 AS a, table2 AS b WHERE a.id = b.id AND a.field = 1

...