我有一个像这样的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非常长且效率低下。我能更聪明地做到这一点吗?
答案 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和其他列等于它的意思,它就应该与您的第一个过滤器匹配。