【问题标题】:Mysql how to exclude a subset from a set? [closed]Mysql如何从集合中排除一个子集? [关闭]
【发布时间】:2020-08-19 16:06:37
【问题描述】:

我有一张如下图所示的虚拟桌子,显示谁拥有食物。 null 表示食物是共同拥有的。我正在考虑询问主人拥有什么食物。假设所有者 A,输出将是以下输出。如果所有者还拥有共同拥有的东西,则输出将仅打印“2”而不是“1”和“2”。我已经尝试使用not exist 进行查询,但仍然无法通过逻辑。我怎样才能实现我想要的逻辑?谢谢!

Table t:
ID   OWNER   FOOD
1    null    rice
2    A       rice
3    B       apple
4    null    orange

Output:
ID   OWNER   FOOD
2    A       rice
4    null    orange

Tried query:
SELECT *
FROM table t
WHERE t.OWNER= 'A'
AND NOT EXISTS (    ....
                )

【问题讨论】:

    标签: mysql sql select set


    【解决方案1】:

    您可以尝试使用此存在逻辑:

    SELECT *
    FROM yourTable t1
    WHERE
        OWNER = 'A' OR
        (OWNER IS NULL AND NOT EXISTS (SELECT 1 FROM yourTable t2
                                       WHERE t2.FOOD = t1.FOOD AND t2.OWNER = 'A'));
    

    Demo

    这里的逻辑是保留所有者为 A 的任何记录,任何所有者为空的记录,前提是我们尚未将 A 记录包含在相同的食物中作为那个空记录。

    编辑:

    如果您需要上述查询运行得更快,您可以通过添加以下复合索引对其进行优化:

    CREATE INDEX idx ON yourTable (OWNER, FOOD);
    

    这应该会加速外部查询中的WHERE 子句,以及加速存在的查找。

    【讨论】:

    • 请问您为什么使用“select 1”而不是“select *”?
    • 没有理由,两者都行。在某些数据库中,可能使用SELECT 1 比使用SELECT * 更有优势。
    • 有更快的方法来实现这个逻辑吗?我发现当数据是批量时,不存在需要很长时间才能完成它
    • @WILLIAM 添加索引,q.v。我在上面的更新答案。
    猜你喜欢
    • 2021-08-27
    • 2018-08-10
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    • 1970-01-01
    • 2021-03-07
    相关资源
    最近更新 更多