我想展开a question I posted a while ago :
我在表中查询列对在特定集合中的行。例如,考虑下表:
id | f1 | f2 ------------- 1 | 'a' | 20 2 | 'b' | 20 3 | 'a' | 30 4 | 'b' | 20 5 | 'c' | 20
我希望提取 (f1, f2) 对在指定的一组对中的行,例如(('a',30), ('b', 20),...)。在原始问题中,Mark正确回答我可以使用以下语法:
SELECT * FROM my_table WHERE (f1,f2) IN (('a',30), ('b',20))
这工作正常,但我看到一些关于索引的意外行为:
我为 f1、f2 定义了一个多列索引,名为 IndexF1F2。使用 EXPLAIN 短语,我看到 MySql 使用索引进行单个比较,例如:
SELECT * FROM my_table WHERE (f1,f2) = ('a',30)
但不是在使用“IN”子句时,如上例所示。给予提示,例如USE INDEX(IndexF1F2)
甚至 FORCE INDEX(IndexF1F2)
,似乎没有任何区别。
有什么想法吗?
最佳答案
这是一个 known bug在 MySQL
中。
使用这个语法:
SELECT *
FROM composite
WHERE (f1, f2) = ('a', 30)
OR (f1, f2) = ('b', 20)
关于SQL 通过带索引的多列过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4539395/