0

我有下表:

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

我想知道玩家 AAA 和 BBB 之间比赛的 match_id,但我不知道他们的确切顺序(AAA vs BBB 或 BBB vs AAA)。

现在我使用类似的构造WHERE (('player_1' = AAA AND 'player_2' = BBB) OR ('player_1' = BBB AND 'player_2' = AAA)),但它不能使用键,所以我怀疑它是最有效的。

它在小表(1k+ 条目)上运行良好,但现在我正在处理另一个项目,该表中可能有 100k+ 行,所以我有点担心。

请建议我让 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

尝试UNIONUNION 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_1首先,在 player_2 中是另一个。

假设AAA vs BBBBBB vs AAA将始终存储为 ('AAA', 'BBB'),您可以将查询缩短为:

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