多列SQL过滤
问题描述:
我有一个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))
?
答
那是有效的语法。
如果你不喜欢它的一些其他的替代品:
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
答
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
大声笑,我有有效的语法all al翁。在MySql中验证。谢谢! – bavaza 2010-12-21 15:01:04
让我们来提高赌注:假设我有一个索引列(f1,f2)。使用EXPLAIN短语,我看到MySql使用索引进行单个比较(例如(f1,f2)=('a',30)),但不是'IN'语法。有什么想法吗? – bavaza 2010-12-23 15:05:26
@bavaza:这听起来像一个有趣的问题。我建议你把它作为一个新问题发布(而不是评论),以便它可以被更多人看到。 – 2010-12-23 15:14:32