2012-12-30 65 views
0

我有如下表:Mysql的选择条件

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知道双方球员最好的办法。

+0

PLAYER_1和player_2 - 他们是ID(整数)? –

+0

如果player1和player2相同,则Iqbal的查询会给出错误的结果,那么查询也会重新对该行进行更改。检查我的答案以解决此问题 –

回答

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字段的索引。这将有助于提高性能

+0

嗯,这样比较好,虽然我也应该检查一下player_1!= player_2,但在实际情况下这是不会发生的。 – DimOK

+0

PLAYER_1 IN( “AAA”, “BBB”)和player_2 IN( “AAA”, “BBB”)必须更快 –

+0

@DimOK可以添加PLAYER_1!= player_2与给定的查询。在这种情况下,结果可能会更好 –

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' 

OR你也可以试试这个

SELECT matchid FROM tablename 
WHERE player1 IN ('AAA', 'BBB') AND player2 IN ('AAA', 'BBB') AND 
     player1 != player2; 
+0

当然,我可以使用2个查询,但使用IN()查询看起来更好 – DimOK

+0

然后检查我的其他查询。但我宁愿在查询中使用联合。它比其他人快得多 –

0

是的,使用OR条件肯定会减慢您的查询速度。 我建议改变一下方法。请检查您的模型是否允许以“分类”方式存储玩家(如果您使用ID,按照ID,或按字母顺序如果使用姓名): 每次有两名玩家存储时,请将player_1按字母顺序排列/首先在数字上,在player_2中则是另一个。

假设什么都AAA VS BBBBBB VS AAA总是被存储为( 'AAA', 'BBB'),你可能会缩短查询:

WHERE ('player_1' = 'AAA' AND 'player_2' = 'BBB') 
+0

不,不幸的是,有太多的东西与玩家订购有关,我无法排序或以任何方式改变。 – DimOK