Подтвердить что ты не робот

Удалить с Присоединиться к MySQL

Вот скрипт для создания моих таблиц:

CREATE TABLE clients (
   client_i INT(11),
   PRIMARY KEY (client_id)
);
CREATE TABLE projects (
   project_id INT(11) UNSIGNED,
   client_id INT(11) UNSIGNED,
   PRIMARY KEY (project_id)
);
CREATE TABLE posts (
   post_id INT(11) UNSIGNED,
   project_id INT(11) UNSIGNED,
   PRIMARY KEY (post_id)
);

В моем PHP-коде при удалении клиента я хочу удалить все сообщения проектов:

DELETE 
FROM posts
INNER JOIN projects ON projects.project_id = posts.project_id
WHERE projects.client_id = :client_id;

Таблица записей не имеет внешнего ключа client_id, только project_id. Я хочу удалить сообщения в проектах, которые передали client_id.

Это не работает сейчас, потому что ни один пост не удален.

4b9b3361

Ответ 1

Вам просто нужно указать, что вы хотите удалить записи из таблицы posts:

DELETE posts
FROM posts
INNER JOIN projects ON projects.project_id = posts.project_id
WHERE projects.client_id = :client_id

EDIT: для получения дополнительной информации вы можете увидеть этот альтернативный ответ

Ответ 2

Поскольку вы выбираете несколько таблиц, таблица для удаления больше не является однозначной. Вам необходимо выбрать:

DELETE posts FROM posts
INNER JOIN projects ON projects.project_id = posts.project_id
WHERE projects.client_id = :client_id

В этом случае table_name1 и table_name2 - это table_name1 и та же таблица, так что это будет работать:

DELETE projects FROM posts INNER JOIN [...]

Вы даже можете удалить из обеих таблиц, если хотите:

DELETE posts, projects FROM posts INNER JOIN [...]

Обратите внимание, что order by и limit не работают при удалении нескольких таблиц.

Также учтите, что если вы объявляете псевдоним для таблицы, вы должны использовать псевдоним при обращении к таблице:

DELETE p FROM posts as p INNER JOIN [...]

Взносы от Carpetsmoker и др.

Ответ 3

Или то же самое, с немного отличающимся (IMO более дружелюбным) синтаксисом:

DELETE FROM posts 
USING posts, projects 
WHERE projects.project_id = posts.project_id AND projects.client_id = :client_id;

Кстати, с mysql с помощью соединений почти всегда быстрее, чем подзапросы...

Ответ 4

Вы также можете использовать ALIAS, как это он работает, просто использовал его в моей базе данных! t нужно удалить таблицу из!

DELETE t FROM posts t
INNER JOIN projects p ON t.project_id = p.project_id
AND t.client_id = p.client_id

Ответ 5

Я больше привык к этому подзапросу, но я не пробовал его в MySQL:

DELETE  FROM posts
WHERE   project_id IN (
            SELECT  project_id
            FROM    projects
            WHERE   client_id = :client_id
        );

Ответ 6

MySQL УДАЛИТЬ записи с помощью JOIN

Обычно вы используете INNER JOIN в инструкции SELECT для выбора записей из таблицы с соответствующими записями в других таблицах. Мы также можем использовать предложение INNER JOIN с оператором DELETE для удаления записей из таблицы, а также соответствующих записей в других таблицах, например, для удаления записей из таблиц T1 и T2, удовлетворяющих определенному условию, вы используете следующий оператор:

DELETE T1, T2
FROM T1
INNER JOIN T2 ON T1.key = T2.key
WHERE condition

Обратите внимание, что вы помещаете имена таблиц T1 и T2 между DELETE и FROM. Если вы опускаете таблицу T1, оператор DELETE удаляет записи только в таблице T2, и если вы опускаете таблицу T2, удаляются только записи в таблице T1.

Условие соединения T1.key = T2.key указывает соответствующие записи в таблице T2, которые необходимо удалить.

Условие в предложении WHERE указывает, какие записи в T1 и T2 необходимо удалить.

Ответ 7

Удаление отдельной таблицы:

Чтобы удалить записи из таблицы posts:

DELETE ps 
FROM clients C 
INNER JOIN projects pj ON C.client_id = pj.client_id
INNER JOIN posts ps ON pj.project_id = ps.project_id
WHERE C.client_id = :client_id;

Чтобы удалить записи из таблицы projects:

DELETE pj 
FROM clients C 
INNER JOIN projects pj ON C.client_id = pj.client_id
INNER JOIN posts ps ON pj.project_id = ps.project_id
WHERE C.client_id = :client_id;

Чтобы удалить записи из таблицы clients:

DELETE C
FROM clients C 
INNER JOIN projects pj ON C.client_id = pj.client_id
INNER JOIN posts ps ON pj.project_id = ps.project_id
WHERE C.client_id = :client_id;

Несколько таблиц Удалить:

Чтобы удалить записи из нескольких таблиц из объединенных результатов, вам нужно указать имена таблиц после DELETE как список, разделенный запятыми:

Предположим, что вы хотите удалить записи из всех трех таблиц (posts, projects, clients) для конкретного клиента:

DELETE C,pj,ps 
FROM clients C 
INNER JOIN projects pj ON C.client_id = pj.client_id
INNER JOIN posts ps ON pj.project_id = ps.project_id
WHERE C.client_id = :client_id

Ответ 8

Попробуйте сделать следующее:

DELETE posts.*,projects.* 
FROM posts
INNER JOIN projects ON projects.project_id = posts.project_id
WHERE projects.client_id = :client_id;

Ответ 9

Другим методом удаления с помощью подбора, который лучше, чем с использованием IN, будет WHERE EXISTS

DELETE  FROM posts
WHERE   EXISTS ( SELECT  1 
                 FROM    projects
                 WHERE   projects.client_id = posts.client_id);

Одной из причин использования этого вместо объединения является то, что DELETE с JOIN запрещает использование LIMIT. Если вы хотите удалить блоки, чтобы не создавать полные блокировки таблицы, вы можете добавить LIMIT этот метод DELETE WHERE EXISTS.

Ответ 10

mysql> INSERT INTO tb1 VALUES(1,1),(2,2),(3,3),(6,60),(7,70),(8,80);

mysql> INSERT INTO tb2 VALUES(1,1),(2,2),(3,3),(4,40),(5,50),(9,90);

DELETE записи из одной таблицы:

mysql> DELETE tb1 FROM tb1,tb2 WHERE tb1.id= tb2.id;

УДАЛИТЬ ЗАПИСИ ИЗ обеих таблиц:

mysql> DELETE tb2,tb1 FROM tb2 JOIN tb1 USING(id);

Ответ 11

Если соединение не работает для вас, вы можете попробовать это решение. Он предназначен для удаления сиротских записей из t1, когда не используются внешние ключи + конкретные условия. То есть он удаляет записи из таблицы1, у которых есть пустой код "код" и которые не имеют записей в таблице2, сопоставляя по полю "имя".

delete table1 from table1 t1 
    where  t1.code = '' 
    and 0=(select count(t2.name) from table2 t2 where t2.name=t1.name);

Ответ 12

Попробуйте это,

DELETE posts.*
FROM posts
INNER JOIN projects ON projects.project_id = posts.project_id
WHERE projects.client_id = :client_id

Ответ 13

- Обратите внимание, что вы не можете использовать псевдоним над таблицей, где вам нужно удалить

DELETE tbl_pagos_activos_usuario
FROM tbl_pagos_activos_usuario, tbl_usuarios b, tbl_facturas c
Where tbl_pagos_activos_usuario.usuario=b.cedula
and tbl_pagos_activos_usuario.cod=c.cod
and tbl_pagos_activos_usuario.rif=c.identificador
and tbl_pagos_activos_usuario.usuario=c.pay_for
and tbl_pagos_activos_usuario.nconfppto=c.nconfppto
and NOT ISNULL(tbl_pagos_activos_usuario.nconfppto)
and c.estatus=50