代码之家  ›  专栏  ›  技术社区  ›  Mario

在有许多联接和条件的查询中,如何从单个表中删除记录?

  •  1
  • Mario  · 技术社区  · 6 年前

    有以下相关表格

    enter image description here

    我需要消除 table4 table1 也就是说,存在于 table1_table4 条件是表4 target 与表3不同 目标

    为了确定受影响的行数,我编写了这个查询

    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个受影响的记录。

    现在我需要删除 表1_表4 . 你能告诉我怎么写这个删除查询吗?

    提前谢谢

    2 回复  |  直到 6 年前
        1
  •  1
  •   ScaisEdge    6 年前

    您可以使用与所选内容相同的联接

        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;
    
        2
  •  1
  •   Caius Jard    6 年前

    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
    )
    

    我不太喜欢在长的列表中使用,但这是相对较短的

    您还将注意到您的表1_table4被另一个select包装。为了克服MySQL不允许修改从中选择的表的限制,这是一种敷衍。此子查询将表具体化为临时表,因此MySQL将其视为与您正在更新的表不同的表。作为一个技巧,它可能在MySQL8中不起作用-有关更多信息,请参见第一条评论中发布的链接