0

彼が2つのテーブルを持っているとしましょう

--
-- 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 ;

だから今、私はそのようなクエリを作成する必要があります-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

これは左結合を行うことに注意してください。つまり、「user からの一致する行とともに、phone からすべての行を取得する」ということです。アンチ結合の秘訣は 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


ところで: 各テーブルに他のテーブルを参照する外部キー列があるのは少し珍しいことです。それに対する「ルール」はありませんが、通常、1 つのテーブルまたは他のテーブルに外部キーを持つことで満たすことができる要件を満たす必要はありません。両方向を指す外部キーが必要になるまれなケースがいくつかありますが、これはまれな例外です。

于 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 に答える