67586


１対多の親子関係にあるテーブルがあって  
親を任意条件で検索して子レコードの特定のカラムで積集合(全てに含まれる値)をとりたいのですが  
MySQL でどう書けばいいんでしょうか

例えば

children レコードが

[code]

    FK|VAL
    --+---
    1 | a
    1 | b
    1 | c
    2 | b
    2 | c
    2 | d
    3 | c
    3 | d
    3 | e
    
[/code]

つまり

[code]

    parents 1 が children [a,b,c] を持つ
    parents 2 が children [b,c,d] を持つ
    parents 3 が children [c,d,e] を持つ
    
[/code]

ような状態で  
親の検索結果が1,2,3だったら [abc][bcd][cde] 全てに含まれる [c] のみ  
親が 1,2 だったら [abc][bcd] に含まれる [b,c]  
という結果になるようにしたいです

さらに親の検索結果が０件だった場合と、親の検索結果は存在するけど積をとった結果０件になった場合も区別したいので  
[] と [NULL] を返すか、別カラムにフラグのようなものをつけて返したいです

2 つの積集合なら INNER JOIN をとればいいんですが  
親の検索結果が何個になるかわからないのでどう書けばいいのでしょうか

クエリを分けてフレームワーク側で積を取るしかないでしょうか


CC BY-SA 4.0
2020-06-12T09:53:25.970
67583
2020-06-12T10:32:15.520
2020-06-12T10:06:57.710
question
mysql sql
子テーブルの積集合をとりたい

[code]

    with parent_ids as (
      select 1
      union all
      select 2
      union all
      select 3
    ), children as (
      select 1 as fk, 'a' as val
      union all
      select 1, 'b'
      union all
      select 1, 'c'
      union all
      select 2, 'b'  
      union all
      select 2, 'c'
      union all
      select 2, 'd'
      union all
      select 3, 'c'
      union all
      select 3, 'd'
      union all
      select 3, 'e'
    )
    select children.val, count(*) as cnt from children where children.fk IN (select * from parent_ids)
    group by children.val
    having cnt = (select count(*) from parent_ids);
    
[/code]

上記を実行すると、

[code]

    val | cnt
    ---------
      c |   3
    
[/code]

が取得できます。

親が 0 件かどうか、は、別クエリで実行した方が、結果シンプルになるのではないか、と思っています。(もしくはさらに CTE を発展させるか)


CC BY-SA 4.0
2020-06-12T10:32:15.520
67586
2020-06-12T10:32:15.520
754
67583
answer