在一个包含多个连接和一个条件的查询中,如何从单个表中删除记录?

weylhg0b  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(332)

有下列相关表格

我需要消除他们之间的关系 table4 以及 table1 ,即中存在的数据 table1_table4 条件是表4 target 与表3不同 target 为了确定受影响的行数,我编写了这个查询

SELECT 
    COUNT(*)
FROM
    table2
        INNER JOIN
    table2_table3 ON table2.id = table2_table3.table2_id
        INNER JOIN
    table3 ON table3.id = table2_table3.table3_id
        INNER JOIN
    table1_table2 ON table2.id = table1_table2.table2_id
        INNER JOIN
    table1 ON table1.id = table1_table2.table1_id
        INNER JOIN
    table1_table4 ON table1.id = table1_table4.table1_id
        INNER JOIN
    table4 ON table4.id = table1_table4.table4_id
WHERE
    table3.target != table4.target;

在这里,我确定149个记录将受到影响。
现在我需要删除中受影响的数据 table1_table4 . 你能告诉我怎么写这个删除查询吗?
提前谢谢

ltqd579y

ltqd579y1#

您可以使用与select中相同的连接

DELETE t2.* 
    FROM table2 t2
    INNER JOIN
        table2_table3 ON table2.id = table2_table3.table2_id
            INNER JOIN
        table3 ON table3.id = table2_table3.table3_id
            INNER JOIN
        table1_table2 ON table2.id = table1_table2.table2_id
            INNER JOIN
        table1 ON table1.id = table1_table2.table1_id
            INNER JOIN
        table1_table4 ON table1.id = table1_table4.table1_id
            INNER JOIN
        table4 ON table4.id = table1_table4.table4_id
    WHERE     table3.target != table4.target;

对于表1和表4,如果连接条件相同,可以使用

DELETE table1_table4.*
    FROM table1_table4 
    INNER JOIN
        table2_table3 ON table2.id = table2_table3.table2_id
            INNER JOIN
        table3 ON table3.id = table2_table3.table3_id
            INNER JOIN
        table1_table2 ON table2.id = table1_table2.table2_id
            INNER JOIN
        table1 ON table1.id = table1_table2.table1_id
            INNER JOIN
        table1_table4 ON table1.id = table1_table4.table1_id
            INNER JOIN
        table4 ON table4.id = table1_table4.table4_id
    WHERE     table3.target != table4.target;
n9vozmp4

n9vozmp42#

mysql支持多列输入

delete from table1_table4 where (table1_id, table4_id) in (
 select t14.table1_id, t14.table4_id from
    table2
    INNER JOIN
    table2_table3 ON table2.id = table2_table3.table2_id
    INNER JOIN
    table3 ON table3.id = table2_table3.table3_id
    INNER JOIN
    table1_table2 ON table2.id = table1_table2.table2_id
    INNER JOIN
    table1 ON table1.id = table1_table2.table1_id
    INNER JOIN
    (SELECT * FROM table1_table4) t14 ON table1.id = t14.table1_id
    INNER JOIN
    table4 ON table4.id = t14.table4_id
)

我不太喜欢在长列表中使用in,但这相对来说比较短
您还会注意到您的table1\u table4被 Package 在另一个select中。这是为了克服mysql不允许您修改所选表的限制而做的一个捏造。这个子查询将表具体化为一个临时表,因此mysql将其视为与您正在更新的表不同的表。作为一个技巧,它可能不会在MySQL8中工作-请参阅第一条评论中发布的链接以获取更多信息

相关问题