SQL查询&优化:在各个列中进行多次搜索

时间:2013-08-15 20:23:30

标签: mysql sql

我有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循环?

谢谢。

2 个答案:

答案 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`)

顺便说一句,正如我在上面的评论中所说,123 ... 不是好的列名。我不会在这里重复一遍,但这里有一个转录,显示为什么它容易出错,以及当你写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)