我有一个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非常长且效率低下。我可以更聪明吗?
您的查询几乎是唯一的方法。您可以使用in
:
where mod(colB, 100) in (1, 2) AND
mod(colC, 100) in (1, 2) AND
. . .
更重要的是,对这种类型的操作的需求表明,所有列都代表相似的实体。这进一步表明您应该将值存储为每对一排。这样的桌子看起来像这样:
colA
colType
colValue
使用此数据结构的查询将更简单,更短。
您可以像下面的那样做:
SELECT * FROM MYTABLE WHERE
where mod(colB, 100) in (1, 2) AND
colB = colC AND colB = colD AND colB = colE ... etc
由于您已经检查了COLB,只要Colb和其他列等于其应与您的第一个过滤器匹配。