我有这个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;
答案 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
来优化查询。您正在寻找由REF1
和REF2
与WEB_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`;
)