2010-12-20 77 views
4

我有一个MySql表,我想查询其中列在特定集合中的行。 例如,假设我的表看起来像这样:多列SQL过滤

id | f1 | f2 
-------------  
1 | 'a' | 20 
2 | 'b' | 20 
3 | 'a' | 30 
4 | 'b' | 20 
5 | 'c' | 20 

现在,我希望提取的行,其中该对(F1,F2)要么( '一个',30)或( 'B' ,20),即行2,3,4。我也希望使用'IN'样式过滤器,因为我可能有许多对要获取。如果我尝试类似:

SELECT * FROM my_table WHERE f1 IN ('a','b') AND f2 IN (30, 20)

我得到了在IN子句f1和f2指定的值的笛卡尔乘积,即与所有可能的组合为F1 =“A”或“B”的行,并且f2 = 30,20,因此行1也被选择。

总之,我需要的是这样的:只有一个有效的SQL语法:-)

任何想法

SELECT * FROM my_table WHERE (f1,f2) IN (('a',30), ('b',20))

回答

4

有效的语法。

如果你不喜欢它的一些其他的替代品:

SELECT * FROM my_table 
WHERE (f1, f2) = ('a', 30) 
OR (f1, f2) = ('b', 20) 

或使用联接:

SELECT * 
FROM my_table T1 
(
    SELECT 'a' AS f1, 30 AS f2 
    UNION ALL 
    SELECT 'b', 20 
) T2 
ON T1.f1 = T2.f1 AND T1.f2 = T2.f2 
+2

大声笑,我有有效的语法all al翁。在MySql中验证。谢谢! – bavaza 2010-12-21 15:01:04

+0

让我们来提高赌注:假设我有一个索引列(f1,f2)。使用EXPLAIN短语,我看到MySql使用索引进行单个比较(例如(f1,f2)=('a',30)),但不是'IN'语法。有什么想法吗? – bavaza 2010-12-23 15:05:26

+0

@bavaza:这听起来像一个有趣的问题。我建议你把它作为一个新问题发布(而不是评论),以便它可以被更多人看到。 – 2010-12-23 15:14:32

0
SELECT * FROM my_table WHERE (f1= 'a' AND f2=30) OR (f1='b' AND f2=20); 
+0

如果我想要AND而不是OR,该怎么办? – Akhil 2016-09-27 04:47:38

0

一个粗略但可行的方式是使用字符串连接:

SELECT * 
FROM MyTable 
WHERE CONCAT(f1, '_', f2) IN ('a_30', 'b_20') 
+1

也有潜在危险,因为111可能意味着{1,11}或{11,1} – Ronnis 2010-12-20 14:37:14

+0

对,我忘了'CONCAT'中的'_'。当然,f1或f2都不应该包含'_'! – Don 2010-12-20 14:57:48