0
我有这样定义了几桌:多好的办法否定子查询
CREATE TABLE `member` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
...
)
CREATE TABLE `members_to_delete` (
`id` bigint(20),
...
)
CREATE TABLE `message` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`sender_id` bigint(20) NOT NULL,
`recipient_id` bigint(20) DEFAULT NULL,
...
CONSTRAINT `_FK1` FOREIGN KEY (`sender_id`) REFERENCES `member` (`id`),
CONSTRAINT `_FK2` FOREIGN KEY (`recipient_id`) REFERENCES `member` (`id`)
)
的members_to_delete表包含成员的子集。
只有在members_to_delete表中既不存在sender_id也不存在recipient_id时,才想选择(并最终删除)消息表中的所有行。所以,我想出了这个丑陋的查询:
SELECT id FROM message WHERE sender_id NOT IN (SELECT id FROM members_to_delete)
AND recipient_id NOT IN (SELECT id FROM members_to_delete);
我想一定有写这个查询一种更好的方式,但我不知道它是什么。什么是写这种查询的更有效的方法?
我主要关注的是IN()是否是正确的条件,或者我需要做多个连接。 – Barmar
这就是我最初的目标,但后来我看到了你的想法,并且不想考虑可能存在的索引。 – xQbert
太棒了,谢谢@Barmar! –