2017-06-05 14 views
0

私はこのようなMySQL(5.7)テーブルを持っています。私はすべてのCOLB、COLCを、検索したいMySQL:1つのステートメントで複数の列を検索

+--------+--------------+--------+-------+----------+--------+ 
| 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> |  | 

...、コルムの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 
     . . . 

さらに重要なことは、しかし、このタイプの操作の必要性は、すべての列が同様の実体を代表していることを示唆しています。これはさらに、ペアごとに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およびその他の列があるとして、それはあなたの最初のフィルタと一致している必要があり、その手段に等しいです。

関連する問題