2014-02-15 78 views
0

我有兩個SQL表,'products'和'tags'。他們有一個n:m的關係,使用第三個表'product_tags'。mysql n:m關係刪除查詢1242子查詢返回多於1行

我想一起刪除一些產品和相應的標籤。

比方說,我已經products.product_id = 3,該產品具有tags.tag_id = 3,tags.tag_id = 5

product_tags表

的product_id 3 TAG_ID 3
的product_id 3 TAG_ID 5

delete from tags where tag_id in (select product_tags.tag_id from product_tags where product_id =3); 
delete from tags where tag_in = any (select product_tags.tag_id from product_tags where product_id=3); 

要麼會產生

0 row(s) affected, 1 warning(s): 1242 Subquery returns more than 1 row 

那麼,我該如何做到這一點?

回答

0

首先您最有可能想要刪除未與其他產品一起使用的標籤。例如。如果tag_id = 3的標籤也與其他產品一起使用,比如說product_id = 1,那麼您不應該刪除該標籤。

其次如果您有適當的父 - 子關係與外鍵一起執行,則必須按正確的順序從表中刪除行。首先你應該從product_tags刪除行。

話雖這麼說,你的代碼安全地刪除產品與未使用的標記沿看起來

DELIMITER // 
CREATE PROCEDURE delete_product(IN _product_id INT) 
BEGIN 
    DROP TEMPORARY TABLE IF EXISTS tmp_tags_to_be_deleted; 

    START TRANSACTION; 

    CREATE TEMPORARY TABLE tmp_tags_to_be_deleted(tag_id INT PRIMARY KEY); 
    INSERT INTO tmp_tags_to_be_deleted 
    SELECT tag_id 
    FROM product_tags t 
    WHERE product_id = _product_id 
    AND NOT EXISTS 
    (
    SELECT * 
     FROM product_tags 
    WHERE tag_id = t.tag_id 
     AND product_id <> t.product_id 
); 

    DELETE 
    FROM product_tags 
    WHERE product_id = _product_id; 

    DELETE t 
    FROM tags t JOIN tmp_tags_to_be_deleted x 
     ON t.tag_id = x.tag_id; 

    DELETE 
    FROM products 
    WHERE product_id = _product_id; 

    COMMIT; 
END// 
DELIMITER ; 

用法:

CALL delete_product(3); 

這裏是SQLFiddle演示

+0

我真的很感激你的答案。感謝您的時間!我會嘗試你的解決方案〜。有一個美好的一天〜! – coverboy

相關問題