Mysql如何从一个集合中排除一个子集?[关闭]

问题描述 投票:0回答:1

我有一个假表,如下图所示,显示谁拥有食物。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个回答
2
投票

你可以尝试使用这个存在逻辑。

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

演示一下

这里的逻辑是保留任何记录,其中的所有者是。A, 任何记录的所有者为null,只要我们还没有包含一个 A 与该无效记录相同的食物的记录。

编辑。

如果你需要上述查询运行得更快,你可以通过添加以下复合索引来优化它。

CREATE INDEX idx ON yourTable (OWNER, FOOD);

这样可以加快 WHERE 子句,同时也加快了existence的查找速度。

© www.soinside.com 2019 - 2024. All rights reserved.