如何基于结果集中已存在的行查询其他行

时间:2018-11-26 22:12:38

标签: mysql sql

我确实认为该主题非常令人困惑,所以让我通过这个小例子来说明我的问题:

假设我有一个Entity表,字段为id, feature, group_id。 group_id是另一个表的引用键

id | feature | group_id
-----------------------------
1  |  true   | group_1

2  |  false  | group_1

3  |  false  | group_2

4  |  true   | null

你们可以建议如何使用feature = true查询所有记录,以及如何将同一组中的所有记录添加到该记录中,而与功能标志无关。 因此,在上表中,结果应为1(由于true)和2(因为它与通过我们的谓词的1具有相同的组)

也许重要的是要知道,在真实的查询中,feature = true条件是数百行/// subselects语句(但现在,也许我们只关注上面提到的简单示例)。

更新:我添加了ID为4的行,其中group_id为空

3 个答案:

答案 0 :(得分:2)

您可以使用IN子句:

SELECT * FROM Entity
WHERE group_id IN (SELECT group_id FROM entity WHERE feature = true)

如果MySQL的group_id可以为null,则可以使用:

SELECT * FROM Entity
WHERE IFNULL(group_id, 0) IN (SELECT IFNULL(group_id, 0) FROM entity WHERE feature = true)

(因此它将NULL转换为0,这意味着它仍然可以与in子句一起使用。但是,请确保group_id永远不会为0或仍然可能失败。您可以改用-1。)

答案 1 :(得分:0)

您可以使用EXISTS

SELECT * FROM Entity E1
WHERE EXISTS (SELECT 1 
              FROM Entity E2 
              WHERE E1.group_id = E2.group_id 
              AND E2.feature = 'true'
              )

答案 2 :(得分:0)

这将起作用:

select * from Entity where group_id in (select group_id from Entity where feature = 
'true');