MySQLについて教えてください。


下記のようなテーブルがあります。

テーブル名: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文を書かなくてはいけないのでもし他に効率的なやり方があれば教えてください。
よろしくお願いします。

回答の条件
  • 1人5回まで
  • 登録:2006/11/19 17:13:47
  • 終了:2006/11/26 13:01:07

ベストアンサー

id:kurukuru-neko No.3

kurukuru-neko回答回数1844ベストアンサー獲得回数1552006/11/19 19:01:14

ポイント100pt

A#1の方が簡単ですね。

REGEXPを使う場合は、MySQLバージョンによっては

以下の点を考慮する必要があります。

他RDBMSとの比較

http://oss.timedia.co.jp/show/column/hibi/MySQL

http://blog.cles.jp/item/1518

http://www.irori.org/tool/mregexp.html

id:purupuru820

詳細な解説ありがとうございました。参考になりました。

2006/11/26 12:59:33

その他の回答(4件)

id:rev-9 No.1

rev-9回答回数61ベストアンサー獲得回数82006/11/19 17:49:45

ポイント50pt

http://dev.mysql.com/doc/refman/4.1/ja/regexp.html

正規表現を使えば、ここまでは短くなります。

select * from tblname where name.kana regexp "^[カキクケコガギグゲゴ]";

id:purupuru820

ありがとうございます。試してみたのですが全てのレコードを抽出してしまいます。kanaの先頭の文字のみ参照したいのですが無理でしょうか?

2006/11/19 18:55:38
id:kurukuru-neko No.2

kurukuru-neko回答回数1844ベストアンサー獲得回数1552006/11/19 17:51:15

ポイント100pt

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

id:purupuru820

ありがとうございます。試してみます。

2006/11/26 12:57:04
id:kurukuru-neko No.3

kurukuru-neko回答回数1844ベストアンサー獲得回数1552006/11/19 19:01:14ここでベストアンサー

ポイント100pt

A#1の方が簡単ですね。

REGEXPを使う場合は、MySQLバージョンによっては

以下の点を考慮する必要があります。

他RDBMSとの比較

http://oss.timedia.co.jp/show/column/hibi/MySQL

http://blog.cles.jp/item/1518

http://www.irori.org/tool/mregexp.html

id:purupuru820

詳細な解説ありがとうございました。参考になりました。

2006/11/26 12:59:33
id:fonya3 No.4

fonya3回答回数238ベストアンサー獲得回数102006/11/19 19:09:11

ポイント20pt

異解ですが、私なら最初からtblnameに「アカサタナハマ・・・」を入れておくカラムを設けておいて登録時に頭文字を登録させます。

*DBはデータを取り出すことを想定して設計する

*登録・更新の頻度はデータを照会する頻度よりはるかに少ない

*複雑な処理は登録時に済ませることで照会時の負荷を軽減できる

システム全体の最適化のために以上のことをいつも念頭においています。

id:purupuru820

アドバイスありがとうございました。今後の参考にしたいと思います。

2006/11/26 12:59:31
id:b-wind No.5

b-wind回答回数3344ベストアンサー獲得回数4402006/11/19 23:34:42

ポイント50pt

元のテーブルに kana_code カラムを追加して

INSERT,UPDATE 時に毎回更新するようにする。

内容は

あ行 -> 1
か行 -> 2
(以下略)

更新時の処理は増えますが、これだとインデックスも効くし分かりやすいと思います。

id:purupuru820

なるほど。試してみます。ありがとうございました。

2006/11/26 12:59:58

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません