MySQL:使用单个语句搜索多个列

时间:2017-06-05 01:32:15

标签: mysql sql

我有一个像这样的MySQL(5.7)表。

+--------+--------------+--------+-------+----------+--------+
| Field  | Type         | Null   | Key   | Default  | Extra  |
|--------+--------------+--------+-------+----------+--------|
| colA   | varchar(50)  | NO     | PRI   | <null>   |        |
| colB   | int(11)      | YES    |       | <null>   |        |
| colC   | int(11)      | YES    |       | <null>   |        |
| colD   | int(11)      | YES    |       | <null>   |        |
| colE   | int(11)      | YES    |       | <null>   |        |
| colF   | int(11)      | YES    |       | <null>   |        |
| colG   | int(11)      | YES    |       | <null>   |        |
| colH   | int(11)      | YES    |       | <null>   |        |
| colI   | int(11)      | YES    |       | <null>   |        |
| colJ   | int(11)      | YES    |       | <null>   |        |
| colK   | int(11)      | YES    |       | <null>   |        |
| colL   | int(11)      | YES    |       | <null>   |        |
| colM   | int(11)      | YES    |       | <null>   |        |

我想搜索所有colB,colC,...,colM mod 100是1或2.我知道我可以用这个来做。

SELECT * FROM MYTABLE WHERE 
(mod(colB, 100) = 1 OR mod(colB, 100) = 2) AND 
(mod(colC, 100) = 1 OR mod(colC, 100) = 2) AND 
(mod(colD, 100) = 1 OR mod(colD, 100) = 2) AND 
                 :
(mod(colM, 100) = 1 OR mod(colM, 100) = 2)  

这个SQL非常长且效率低下。我能更聪明地做到这一点吗?

2 个答案:

答案 0 :(得分:1)

您的查询几乎是唯一的方法。您可以使用in简化它:

where mod(colB, 100) in (1, 2) AND
      mod(colC, 100) in (1, 2) AND
      . . . 

更重要的是,对此类操作的需求表明所有列都代表一个类似的实体。这进一步表明您应该将值存储为每对一行。这样的表看起来像这样:

colA
colType
colValue

使用此数据结构,查询会更简单,更短。

答案 1 :(得分:0)

你可以这样做:

SELECT * FROM MYTABLE WHERE 
where mod(colB, 100) in (1, 2) AND
colB = colC AND colB = colD AND colB = colE ... etc

由于您已经检查过colB,只要colB和其他列等于它的意思,它就应该与您的第一个过滤器匹配。