人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

●質問者: spacewarp
●カテゴリ:科学・統計資料
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● degucho
●200ポイント ベストアンサー

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

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

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

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


spacewarpさんのコメント
ありがとうございます! うまく取れました。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ