0

私は次の表を持っています:

match_id player_1 player_2
1        AAA      BBB
2        CCC      DDD
3        CCC      AAA

AAAとBBBのプレーヤー間のmatch_idを知りたいのですが、正確な順序(AAAとBBB、またはBBBとAAA)がわかりません。

今のところWHERE (('player_1' = AAA AND 'player_2' = BBB) OR ('player_1' = BBB AND 'player_2' = AAA))、のような構造を使用していますが、キーを使用できないため、最も効率的な構造ではないかと思います。

小さなテーブル(1k以上のエントリ)ではうまく機能しましたが、現在、このテーブルの10万以上の行が可能な別のプロジェクトに取り組んでいるので、少し心配しています。

両方のプレーヤーを知っているmatch_idを取得するための最良の方法を提案してください。

4

3 に答える 3

1

クエリを試す

select match_id from table_name where "AAA" in (player_1,player_2) and   
"BBB" in (player_1,player_2);  

player_1 と player_2 フィールドのインデックスを作成することを忘れないでください。パフォーマンスの向上に役立ちます

于 2012-12-30T10:35:15.813 に答える
0

UNIONまたはUNION ALLを試して、両方の列にインデックスを実装します。

SELECT match_id FROM tablename 
WHERE player1='AAA' AND player2='BBB' 
UNION 
SELECT match_id FROM tablename 
WHERE player1='BBB' AND player2='AAA'

または、これを試すこともできます

SELECT matchid FROM tablename 
WHERE player1 IN ('AAA', 'BBB') AND player2 IN ('AAA', 'BBB') AND 
      player1 != player2;
于 2012-12-30T10:30:35.217 に答える
0

はい、条件で OR を使用すると、クエリが確実に遅くなります。アプローチを少し変更することを提案します。お使いのモデルがプレーヤーを「並べ替え」た方法 (ID を使用する場合は ID 順、名前を使用する場合はアルファベット順) で保存できるかどうかを確認してください:まず、player_2 でもう 1 つ。

AAA 対 BBBBBB 対 AAAの両方が常に ('AAA', 'BBB') として保存されると仮定すると、クエリを次のように短縮できます。

WHERE ('player_1' = 'AAA' AND 'player_2' = 'BBB')
于 2012-12-30T10:37:17.017 に答える