0

假设他有两张桌子

--
-- Table structure for table `user`
--

CREATE TABLE IF NOT EXISTS `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `phoneID` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;


--
-- Table structure for table `phone`
--

CREATE TABLE IF NOT EXISTS `phone` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `userID` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

所以现在我需要创建这样的查询 - 我需要从电话表中删除用户 ID 不存在的所有电话条目(意味着用户已从用户表中删除并且没有这样的用户 ID),只使用一个查询。

我的想法:我们可以使用 innerJoin 来选择所有相等的条目,然后我们需要以某种方式从电话表中删除其他条目。

请帮忙。

WBR

4

2 回答 2

1

你在正确的轨道上。但是您需要的是一个执行“反连接”的查询,以便从中获取所有行phone中没有匹配的行user

先写查询:

SELECT p.*
  FROM `phone` p 
  LEFT
  JOIN `user` u 
    ON u.id = p.userID
 WHERE u.id IS NULL

请注意,这是一个左连接,所以它的意思是“从电话中获取所有行,以及来自用户的任何匹配行”。反连接的技巧是 WHERE 子句,它说,“消除我们找到匹配的所有行”。所以我们剩下的是phone那些没有匹配行的行user

确认这是您要删除的行集后,只需将 SELECT 关键字更改为 DELETE:

-- SELECT p.*
DELETE p.*
  FROM `phone` p 
  LEFT
  JOIN `user` u 
    ON u.id = p.userID
 WHERE u.id IS NULL

http://dev.mysql.com/doc/refman/5.5/en/delete.html


顺便说一句:每个表中的外键列都引用另一个表有点不寻常。没有反对它的“规则”,但通常不需要满足仅在一个表或另一个表中具有外键即可满足的要求。在某些极端情况下,我们需要指向两个方向的外键,但这是一个罕见的例外。

于 2013-08-08T13:19:04.047 回答
0
delete phone where userid not in (select user_id from user);

顺便说一句PhoneID不应该是用户表中的字段。

于 2013-08-08T13:09:38.020 回答