2016-09-28 14 views
0

私は大きな約10GBの大規模なmysqlデータベースを持っています。データベース内のテーブルの一つは、このクライアントは、この列内の数字に混入されて作成された日付行ID内で正確な日付の大規模なMySQLデータベースを検索

case 

という名前columがあり、そのテーブルで

clients 

と呼ばれています。ここで

case

011706-0001 

内のエントリの例である06の部分は、このクライアントは、2006年に作成されたことを意味し、私は2015年と2016年に作成されたすべてのクライアントをプルする必要があるので、私のようにする必要がありcaseにダッシュの前に15または16があるものを照会します。

例えば、

000015-0000または000016-0000は、MySQLだけでこれを行う方法はありますか?私の思考プロセスは、私は全体の列をクエリしてから、PHPを使用しなければならなかったでしょうpreg_match()

これは問題を引き起こすと私は心配しています。

SELECT ... 
    FROM clients t 
    WHERE t.case LIKE '%06-%' 
    ORDER BY ... 

:ダッシュ続い'06-'(文字0と6が含まれているcase列の値を持つ行を検索するには

答えて

4

...

1つのオプションは、LIKE比較演算子を使用することですパーセント記号文字は、LIKE比較のワイルドカードであり、任意の数の文字(0個、1個以上)に一致します。

MySQLはのすべての条件を評価する必要があります。テーブルの行。 MySQLはインデックス範囲のスキャン操作を利用することはできません。 3つの文字'15-'または'16-'の配列を含む任意の値をtrueに評価されます

SELECT ... 
    FROM clients t 
    WHERE t.case LIKE '%15-%' 
    OR t.case LIKE '%16-%' 
    ORDER BY ... 

caseカラムの値の標準フォーマットがある場合、値は常に日付が'mmddyy-nnnnn'である正確に6文字で始まり、5番目から7番目の文字だけを一致させたい場合は、アンダースコアのワイルドカード文字を使用できます。 4アンダースコア

t.case LIKE '____16-%' 

それとも、case値から3つの文字を抽出し、等価比較を実行するためにSUBSTR機能を使用することができますを使用して...例えば(LIKE比較して)任意の1文字に一致します...

LIKE比較の代わりにREGEXPの比較を利用することもできます。


上記のすべてのアプローチは、比較条件を評価するために、テーブル内のすべての行をクランクする必要があります。

DATEデータ型として別の列として格納され、先頭の列として索引がある場合、MySQLはこのような問合せに対してレンジ走査操作を有効に使用できます。 ..

WHERE t.casedate >= '2015-01-01' 
    AND t.casedate < '2017-01-01' 
関連する問題