以下のようなテーブルがあるとき、
人間テーブル
1,桃太郎
2,金太郎
3,浦島太郎
4,かぐや姫
5,おじいさん
...
動物テーブル
1,猿
2,亀
3,ウサギ
4,カニ
5,犬
....
....
対戦テーブル(実際は名前ではなく、人間IDと動物IDが入っています)
1,かぐや姫,猿
2,金太郎,犬
3,浦島太郎,カニ
4,金太郎,熊
....
....
人間テーブルに50000人
動物テーブルに10000匹
対戦テーブルが1000000対戦の組み合わせ
があるとき、
人間テーブルから任意に5000人
動物テーブルから任意に30匹を抽出します。
単純にこの全組み合わせの対戦テーブルを作ろうとすると
5000x30 = 150000対戦ができると思いますが、
すでに対戦したことある組み合わせは除きたいです。
1.初顔合わせの対戦の組み合わせ数、
2.初顔合わせの対戦の組み合わせリスト
それぞれ取得したいのですが、
総当たりでループさせながら150000対戦分を対戦テーブルと
重複チェックを行うと150000回クエリーを実行するので、かなり重くなります。
こうしたパフォーマンスを考慮した上で上記の1,2を取得する、
できれば1回のクエリーで取れるような方法はあるでしょうか。
重複チェックはすでに対戦テーブルにあるものとの比較という意味でよいでしょうか?
SELECT 人間.*,動物.*
FROM 人間,動物
でFROM句にJOIN条件を指定しないで書くと全パターンがとれます
(直積といいます)
これに対戦テーブルを外部結合するとマッチしなかったものはNULLが返るので
SELECT パターン.*
FROM
(SELECT 人間.*,動物.*
FROM 人間,動物
) パターン
LEFT JOIN 対戦
ON パターン.人間 = 対戦.人間
AND パターン.動物 = 対戦.動物
WHERE 対戦.対戦ID IS NULL
などとすると初顔が取れると思います