【问题标题】:Better approach for multiple negated subqueries多个否定子查询的更好方法
【发布时间】:2017-09-26 20:33:36
【问题描述】:

我有几个这样定义的表:

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

我认为必须有更好的方法来编写此查询,但我不确定它是什么。编写这种查询的更有效方法是什么?

【问题讨论】:

    标签: mysql select in-subquery


    【解决方案1】:

    您可以将Return row only if value doesn't exist 中的技术用于多个列。

    SELECT m.id
    FROM message AS m
    LEFT JOIN members_to_delete AS d
    ON d.id IN (m.sender_id, m.recipient_id)
    WHERE d.id IS NULL
    

    【讨论】:

    • 我主要关注IN() 是否适合此条件,或者我需要进行多次连接。
    • 这就是我最初要去的地方,但后来我看到了你的,不想考虑可能存在哪些索引。
    猜你喜欢
    • 2012-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-07
    • 1970-01-01
    • 2012-07-20
    • 1970-01-01
    相关资源
    最近更新 更多