我有1,2,3,4,5,6,7,8,9,10列,我想在所有这些编号的列中搜索一个特定的值并且名称= Bob
所以:
SELECT * FROM table WHERE name = BOB AND 1="value" OR 2="value" OR 3="value"
依旧......
最有效和最好的方法是什么?并且在实例中列的实际编号与我的示例相同,是否有一种方法可以在查询内部进行索引以便从1-10循环?
谢谢。
答案 0 :(得分:1)
而不是使用OR
使用Union
。
这样的事情: -
SELECT * FROM table WHERE name = BOB AND 1="value"
UNION
SELECT * FROM table WHERE name = BOB AND 2="value"
UNION
SELECT * FROM table WHERE name = BOB AND 3="value"
答案 1 :(得分:0)
最有效和最好的方法是什么?
SELECT * FROM table WHERE name = BOB AND `1`="value" OR `2`="value" OR `3`="value"
我的赌注是使用OR
的上述声明可能是您最好的选择之一。
还有(可能)其他几种变体。无论如何,您必须使用EXPLAIN SELECT
比较它们,看它是否表现更好或更差 - 取决于您的特定数据和索引。
总结这个“答案”,这是一个替代解决方案。至少,比一堆或OR
...
SELECT * FROM table WHERE name = BOB AND "value" IN (`1`,`2`,`3`)
顺便说一句,正如我在上面的评论中所说,1
,2
,3
... 不是好的列名。我不会在这里重复一遍,但这里有一个转录,显示为什么它容易出错,以及当你写1 = "hello"
时发生了什么:
mysql> SELECT True FROM DUAL WHERE 1 = "hello";
Empty set, 1 warning (0.00 sec)
mysql> SHOW WARNINGS;
+---------+------+-------------------------------------------+
| Level | Code | Message |
+---------+------+-------------------------------------------+
| Warning | 1292 | Truncated incorrect DOUBLE value: 'hello' |
+---------+------+-------------------------------------------+
1 row in set (0.00 sec)
mysql> EXPLAIN SELECT True FROM DUAL WHERE 1 = "hello";
+----+-------------+-----+------------------+
| id | select_type | ... | Extra |
+----+-------------+-----+------------------+
| 1 | SIMPLE | ... | Impossible WHERE |
+----+-------------+-----+------------------+
1 row in set, 1 warning (0.00 sec)