仅当该集合中的所有项目符合特定条件时,才返回集合ID

时间:2016-07-12 10:31:41

标签: mysql

我看过similar questions,但我似乎无法理解答案是如何运作的,以便将它们应用到我的案例中。

我有一些文章(set_table)

ID SET   ID ART
1        1
1        4
2        1
2        4
3        2
1        3

这些文章的表格及其父ID。 (article_table)

ID ART   ID PARENT
1        1
2        3
3        2
4        1

那些父母有一个他们必须遇到的条件,但它可能是多个(parent_table):

PARENT ID  GROUP ID
1          6
2          15
3          12

意思是,我必须选择其文章(所有这些)都在GROUP 6中的所有集合,然后结果应该是ID SET:2。或者我可能需要选择其文章(所有这些)都在的所有集合组6和15,然后结果应该是ID SET:1。或者我可能需要选择其文章(所有这些)都在第6组,第12组中的所有组;那么结果应该是NULL。

我试过了:

SELECT parent_id
FROM parent_table
WHERE group_id IN (6,15)
GROUP BY parent_id
HAVING COUNT(DISTINCT group_id) = 2; -- Number of group ids

哪个很酷,但我无法正确过滤套装,我选择套装的尝试无效。

2 个答案:

答案 0 :(得分:1)

一旦开始编写,下面的查询就不那么痛苦了。只需将三个表连接在一起,然后使用条件聚合来计算ID_SET中具有所需组的条目数。

以下查询查找具有6或12组的ID_SET值。请注意,这将为您在原始问题中提供的样本数据返回空结果集。需要DISTINCT子查询来删除重复的组值,否则会丢弃条件聚合。

SELECT t.ID_SET,
    SUM(CASE WHEN t.GROUP_ID IN (6, 12) THEN 1 ELSE 0 END) AS groupCount
FROM
(
    SELECT DISTINCT s.ID_SET, p.GROUP_ID
    FROM set_table s
    INNER JOIN article_table a
        ON s.ID_ART = a.ID_ART
    INNER JOIN parent_table p
        ON a.ID_PARENT = p.PARENT_ID
) t
GROUP BY t.ID_SET
HAVING groupCount = 2   -- change 2 to however many group values you want to match

答案 1 :(得分:0)

使用以下查询

select ID ART 
from articles a 
join Parent1 p1 on a.ID ART = p1.ID ART 
join Parent2 p2 on p1.ID PARENT = p2.PARENT ID AND p2.GROUP ID in (6,12)