MySQL查询(将SELECT更改为DELETE)

时间:2014-08-25 13:48:08

标签: mysql sql

我有这个mysql查询:

SELECT 
    F.ID,
    F.REF1,
    F.REF2
FROM FRIENDS F
LEFT JOIN ACCOUNTS A1 on A1.id = F.REF1
LEFT JOIN ACCOUNTS A2 on A2.id = F.REF2
WHERE A1.WEB_IP = A2.WEB_IP;

我试图将其更改为DELETE命令而不是SELECT。不知何故,它现在正在运作

查询不起作用:

DELETE FROM FRIENDS WHERE LEFT JOIN ACCOUNTS A1 on A1.id = FRIENDS.REF1
LEFT JOIN ACCOUNTS A2 on A2.id = FRIENDS.REF2
WHERE A1.WEB_IP = A2.WEB_IP;

5 个答案:

答案 0 :(得分:2)

您可能想要使用:

DELETE friends
FROM frineds 
     LEFT JOIN accounts a1 on a1.id = friends.ref1
     LEFT JOIN accounts a2 on a2.id = friends.ref2
WHERE a1.web_ip = a2.web_ip;

您可以找到此参考useful

答案 1 :(得分:1)

您可以使用"double from"语法:

delete from f
from friends f
left join accounts a1 on a1.id = f.ref1
...

答案 2 :(得分:1)

我个人更喜欢在您要删除的联接中指定表时忽略FROM。对我来说,这样可以更容易地将删除的traget表与连接混淆。在您的情况下,看起来像:

DELETE friends, a1 /* leave off a1 if you only want to delete from friends */
FROM friends
LEFT JOIN accounts as a1
  ON a1.id = friends.ref1
LEFT JOIN accounts as a2
  ON a2.id = friends.ref2
WHERE a1.web_ip = a2.web_ip;

你也可以考虑让(IMO)习惯将MySQL关键字置于大写,将架构对象置于小写。我当然有助于使查询更容易阅读。

答案 3 :(得分:1)

这是一种删除与查询返回的ID相对应的行的简单方法:

DELETE FROM FRIENDS
WHERE ID IN (SELECT F.ID FROM FRIENDS F LEFT JOIN ...)

这是第二个解决方案,它更具可读性和更高性能(直接从DELETE语句使用jointure而不是使用子查询):

DELETE F
FROM FRIENDS F
INNER JOIN ACCOUNTS A1 ON A1.id = F.REF1
INNER JOIN ACCOUNTS A2 ON A2.id = F.REF2
WHERE A1.WEB_IP = A2.WEB_IP

第二个命题使用INNER JOIN代替LEFT JOIN来优化查询。您正在寻找由REF1REF2WEB_IP相关联的朋友。在这种情况下使用LEFT JOIN是没用的。

希望这会有所帮助。

答案 4 :(得分:0)

您可以在子查询中使用精确选择删除语句

DELETE FROM `friends` 
WHERE `ID` IN 
(   SELECT `ID`
    FROM `FRIENDS` F
    LEFT JOIN `ACCOUNTS` A1 on A1.`id` = F.`REF1`
    LEFT JOIN `ACCOUNTS` A2 on A2.`id` = F.`REF2`
    WHERE A1.`WEB_IP` = A2.`WEB_IP`;
)