人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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


●質問者: purupuru820
●カテゴリ:インターネット ウェブ制作
✍キーワード:HTML KANA MySQL name SELECT
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● rev-9
●50ポイント

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

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

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

◎質問者からの返答

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


2 ● kurukuru-neko
●100ポイント

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

◎質問者からの返答

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


3 ● kurukuru-neko
●100ポイント ベストアンサー

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

◎質問者からの返答

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


4 ● fonya3
●20ポイント

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

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

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

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

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

◎質問者からの返答

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


5 ● b-wind
●50ポイント

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

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

内容は

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

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

◎質問者からの返答

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ