SQL(重複チェック)についての質問


以下のようなテーブルがあるとき、

人間テーブル
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回のクエリーで取れるような方法はあるでしょうか。

回答の条件
  • 1人1回まで
  • 13歳以上
  • 登録:2015/09/08 10:44:12
  • 終了:2015/09/09 11:26:40

ベストアンサー

id:degucho No.1

degucho回答回数250ベストアンサー獲得回数652015/09/08 20:20:17

ポイント200pt

重複チェックはすでに対戦テーブルにあるものとの比較という意味でよいでしょうか?
SELECT 人間.*,動物.*
FROM 人間,動物
でFROM句にJOIN条件を指定しないで書くと全パターンがとれます
(直積といいます)

これに対戦テーブルを外部結合するとマッチしなかったものはNULLが返るので

SELECT パターン.*
FROM
(SELECT 人間.*,動物.*
FROM 人間,動物
) パターン
LEFT JOIN 対戦
ON パターン.人間 = 対戦.人間
AND パターン.動物 = 対戦.動物
WHERE 対戦.対戦ID IS NULL

などとすると初顔が取れると思います

id:spacewarp

ありがとうございます!
うまく取れました。

2015/09/09 11:26:27

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません