以下に示すように4つのテーブルがあります
基本的に、テーブル1からテーブル2、3、および4に存在するユーザーの数を取得します。同様に、テーブル2についても、テーブル1、3、および4に存在するユーザーの数を取得し、テーブル3および4についても同じです。
基本的にすべての可能な組み合わせ。私が望む最終結果は以下のようなものです
私が解決しようとしている方法の1つは、他のテーブルleft-join
でoftable1
を実行してcount
から、出力の最初の行を取得することです。しかし、考えられるすべての組み合わせに対してそれを行うことは最適化されていません。私は可能な他の選択肢を探していました
同じための私のコード
SELECT
COUNT(DISTINCT A.id) table1,
COUNT(DISTINCT B.id) table2,
COUNT(DISTINCT C.id) table3,
COUNT(DISTINCT D.id) table4
FROM table1 A
LEFT JOIN table2 B
ON A.id = B.id
LEFT JOIN table3 C
ON A.id = C.id
LEFT JOIN table4 D
ON A.id = D.id
db-fiddle(このフィドルはmysql用であり、db固有のアプローチよりも一般的なSQLベースのアプローチを探しています)
私がお勧めします:
with t as (
select 'table1' as which, id from table1 union all
select 'table2' as which, id from table2 union all
select 'table3' as which, id from table3 union all
select 'table4' as which, id from table4
)
select ta.which,
sum(case when tb.which = 'table1' then 1 else 0 end) as cnt_table1,
sum(case when tb.which = 'table2' then 1 else 0 end) as cnt_table2,
sum(case when tb.which = 'table3' then 1 else 0 end) as cnt_table3,
sum(case when tb.which = 'table4' then 1 else 0 end) as cnt_table4
from t ta left join
t tb
on ta.id = tb.id
group by ta.which;
注:これは、id
が各テーブルで一意であることを前提としています。これは、列の名前とサンプルデータを考えると妥当な仮定です。ただし、重複がある場合はunion all
、CTEのをに変更できますunion
。
この構造は、追加のテーブルにも簡単に一般化できます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加