下記のようなテーブルがあります。
テーブル名:tblname
int(11) varchar(50) varchar(50)
----------------------------------------------------
no name kana
----------------------------------------------------
1 山田 ヤマダ
2 金田 カネダ
3 合田 ゴウダ
4 小田 オダ
HTMLのページにカ行というボタンがあってそれを押すとこの中から金田と合田を抽出したいのですが下記のようなSQL文以外にやり方があるでしょうか?
select * from tblname
where name.kana like 'カ%' or name.kana like 'キ%' or name.kana like 'ク%' or name.kana like 'ケ%' or name.kana like 'コ%' or name.kana like 'ガ%' or name.kana like 'ギ%' or name.kana like 'グ%' or name.kana like 'ゲ%' or name.kana like 'ゴ%' or name.kana like 'キャ%' or name.kana like 'キュ%' or name.kana like 'キョ%'
これだとカ行以外にもア行・サ行・・・と続き大量のSQL文を書かなくてはいけないのでもし他に効率的なやり方があれば教えてください。
よろしくお願いします。
A#1の方が簡単ですね。
REGEXPを使う場合は、MySQLバージョンによっては
以下の点を考慮する必要があります。
他RDBMSとの比較
http://dev.mysql.com/doc/refman/4.1/ja/regexp.html
正規表現を使えば、ここまでは短くなります。
select * from tblname where name.kana regexp "^[カキクケコガギグゲゴ]";
ありがとうございます。試してみたのですが全てのレコードを抽出してしまいます。kanaの先頭の文字のみ参照したいのですが無理でしょうか?
MYSQL 4.1以上ならサブクエリを使う方法があります。
1. Create Index
http://dev.mysql.com/doc/refman/4.1/ja/create-index.html
2. select in
http://dev.mysql.com/doc/refman/4.1/ja/any-in-some-subqueries.ht...
各あ~わ行の検索対象用のテーブルを作る
create table kanamap (
index(kanaretu char(1)),
kanachar char(2)
);
例:
ア ア
ア イ
ア ウ
・・
カ ガ
検索
select * from tblname where
substring(kana,1,1) in
(select kanachar from kanamap where kanaretu='カ')
select * from tblname where
substring(kana,1,1) in
(select kanachar from kanamap where kanaretu
in ( 'カ','キ','タ')
)
※:実際にコードを実行していないので間違った文法が
あるかもしれません。
件数が多い場合1.でtblnameのkanaの1文字目の索引を作成
すると早くなるかもしれない。
create index tblkana_kana_idx on tblname ( kana(1) )
ありがとうございます。試してみます。
A#1の方が簡単ですね。
REGEXPを使う場合は、MySQLバージョンによっては
以下の点を考慮する必要があります。
他RDBMSとの比較
詳細な解説ありがとうございました。参考になりました。
異解ですが、私なら最初からtblnameに「アカサタナハマ・・・」を入れておくカラムを設けておいて登録時に頭文字を登録させます。
*DBはデータを取り出すことを想定して設計する
*登録・更新の頻度はデータを照会する頻度よりはるかに少ない
*複雑な処理は登録時に済ませることで照会時の負荷を軽減できる
システム全体の最適化のために以上のことをいつも念頭においています。
アドバイスありがとうございました。今後の参考にしたいと思います。
元のテーブルに kana_code カラムを追加して
INSERT,UPDATE 時に毎回更新するようにする。
内容は
あ行 -> 1 か行 -> 2 (以下略)
更新時の処理は増えますが、これだとインデックスも効くし分かりやすいと思います。
なるほど。試してみます。ありがとうございました。
詳細な解説ありがとうございました。参考になりました。