我有两个名为distance
和place
的MySQL表,如下所示:
距离
╔════╦══════╦═══════╗
║ id ║ name ║ point ║
╠════╬══════╬═══════╣
║ 1 ║ Call ║ A ║
║ 2 ║ Foo ║ B ║
╚════╩══════╩═══════╝
地方
╔═══════╦═════════╗
║ point ║ address ║
╠═══════╬═════════╣
║ A ║ ABCD ║
║ B ║ CDEF ║
╚═══════╩═════════╝
'id'是'distance'表的主键,'point'是'place'表的主键。 'point'是'distance'表的外键,由'place'表引用。
我想从'place'表中删除点'A'的行,其中 id 等于'1'。由于此外键是使用'on delete cascade constraint'创建的,因此还应删除place表的相关行。
(这意味着,根据下表,应删除距离表的第一行和地方表的第一行)。
这是我在PHP代码中尝试过的查询:
mysql_query("delete p.point from place p where p.point IN SELECT * FROM (SELECT d.point FROM distance d GROUP BY d.point where d.id='1' )");
但是,这不会删除行。没有错误消息。 有人可以帮我解决这个问题吗?
答案 0 :(得分:2)
尝试在INNER JOIN
查询中使用DELETE
:
DELETE p FROM place p
INNER JOIN distance d ON p.point = d.point
WHERE (d.id = 1);
答案 1 :(得分:0)
您在*
声明中使用WHERE IN
。如果要使用WHERE IN
,则只需选择ID。这是您的固定代码:
mysql_query("delete p from place p where p.point IN (SELECT p.point FROM (SELECT d.point FROM distance d GROUP BY d.point where d.id='1' ))");
但我不明白为什么要使用两个选择,当你可以这样做时
mysql_query("delete p from place p where p.point IN (SELECT d.point FROM distance d GROUP BY d.point where d.id='1' )");
答案 2 :(得分:0)
解决方法1: 您缺少"("在查询中的in子句之后。
解决方案2:更好的选择是加入 -
delete pl.* from place pl
join distance dst on dst.point=pl.point
where d.id=1;
解决方案3:最佳选项只是从父表中删除,并且所有相关行将在删除级联功能时自动从子项中删除。
DELETE FROM place WHERE `point`='A';
答案 3 :(得分:0)
尝试这样做
DELETE FROM place p
WHERE p.point IN (SELECT d.point
FROM distance d
WHERE d.id=1)
所以PHP Query应该是这样的
mysql_query('DELETE FROM place p WHERE p.point IN (SELECT d.point FROM distance d WHERE d.id=1)')
您所做的Sub-Sub Select可能没有返回任何值,因此没有进行任何操作并且没有给出错误,因为查询已正确完成。
答案 4 :(得分:0)
试试这个: -
DELETE p.* FROM place p
INNER JOIN distance d ON p.point = d.point
WHERE d.id = 1;