2017-06-05 41 views
0

我有一個像這樣的MySQL(5.7)表。MySQL:用單個語句搜索多個列

+--------+--------------+--------+-------+----------+--------+ 
| 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非常長且效率低下。我能做得更聰明嗎?

+1

爲什麼你有這麼多列在第一位? –

回答

1

您的查詢幾乎是唯一的方法來做到這一點。您可以使用in簡化它:

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

更重要的是,需要對這種類型的操作建議,所有列都代表一個類似的實體。這進一步表明,您應該將值存儲爲每對一行。這樣的表格看起來是這樣的:

colA 
colType 
colValue 

對於這種數據結構,查詢將會簡單得多並且更短。

0

你可以像下面:

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

既然你已經檢查COLB,只要COLB等列等於它意味着它應與你的第一個過濾器。