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

MYSQLの検索の仕方について質問です。


名前 | オモチャ|
ああ|車
ああ|飛行機
ああ|自転車
あい|車
あい|飛行機
あう|飛行機
あう|自転車


このようなデータベースが合った場合

名前 の方で検索し
合った場合「オモチャ」の値を表示したいのですが
検索した名前も一度だけ表示したいのです


distinctを使用すると「オモチャ」項目に合わせて「名前」を複数表示してしまいますし
group byで「名前」を指定するとwhileで回しても「オモチャ」項目を一つしか表示してくれません。


例えば「あい」で検索した場合

あい
→車、飛行機

という風に表示したいのです。


ヒットした「名前」をキーに再度 WHERE キー することで現在の条件を満たせますが
複数ヒットした場合一々やると負荷が高そうなので負荷の軽い方法を探しています。

この条件でうまくできる方法はないでしょうか?


●質問者: robopit
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● oil999
●5ポイント

SQL文だけで整形するのは無理です。
変数を使ってみてはどうでしょうか。

SET @key='あい';
SELECT @key;
SELECT omocha FROM hoge WHERE name LIKE @key;

robopitさんのコメント
回答ありがとうございます。 MYSQLだけでは無理ですか・・ WHEREループより負荷が少ないやり方があればお願いします。

2 ● うぃんど
●100ポイント ベストアンサー

こういうことでいいかな?
だけど…、こういったことはphpなどの出力側で「出す/出さない」としたほうがシンプルですよ。

CREATE TEMPORARY TABLE T1353108790 (`名前` text,`オモチャ` text)
;
INSERT INTO T1353108790 VALUES
('ああ','車')
,('ああ','飛行機')
,('ああ','自転車')
,('あい','車')
,('あい','飛行機')
,('あう','飛行機')
,('あう','自転車')
;
SET @key='';
SELECT IF(`名前` <> @key,`名前`,'') AS `名前`, @key:=`名前` AS `ソート`, `オモチャ`
FROM T1353108790
ORDER BY `ソート`,`オモチャ`
;

結果

名前ソートオモチャ
ああああ自転車
ああ
ああ飛行機
あいあい
あい飛行機
あうあう自転車
あう飛行機

robopitさんのコメント
ありがとうございます。 MYSQL文自体をいじるよりもPHP側で操作したほうがよいようなので、そちらの方でやってみたいと思います。 ただ、一つ質問したいのですが @key:=`名前`はどういう意味でしょう? :←が何を表しているのかよくわかりません

うぃんどさんのコメント
SETで変数に代入する際には = だけでOKなのですが、 他の場合は := で代入となります。以下マニュアルページからの抜粋。 http://dev.mysql.com/doc/refman/5.1/ja/user-variables.html >> SETでは、=もしくは:=のどちらかが代入演算子として使用できます。各々の変数に割り当てられたexprは整数、実数、文字列、もしくはNULL値を評価できます。しかし、結果セットで変数値が選択された場合、文字列としてクライアントに返されます。 SET以外のステートメントで、ユーザ変数に値を割り当てることもできます。この場合、代入演算子は:=でなくてはならず、=ではありません。これは= が非SET ステートメンとに置いて比較オペレータとして扱われるからです。 << 回答に書いたとおりSQLでも可能ではあるのですが、 MySQLは分析関数を持たないためデータ加工が少し苦手です。 MySQLh単独で使われることもあまりないので、 制御側(phpなど)で行うというシンプルな思考が面倒無くて良いのです。 もちろん…、こういった方法もあるのだということは知っておいて損は無いと思いますけどね。

robopitさんのコメント
はい色々と勉強になりました ベストアンサーで終了させていただきます

うぃんどさんのコメント
大幅訂正です。すみません。 回答No.1に変な方向に誘導されてました。 この問題への回答は非常にカンタンでした。 >|sql| CREATE TEMPORARY TABLE T1353108790 (`名前` text,`オモチャ` text) ; INSERT INTO T1353108790 VALUES ('ああ','車') ,('ああ','飛行機') ,('ああ','自転車') ,('あい','車') ,('あい','飛行機') ,('あう','飛行機') ,('あう','自転車') ; SELECT `名前`, GROUP_CONCAT(`オモチャ` SEPARATOR '、') AS `オモチャ` FROM T1353108790 GROUP BY `名前` ; ||< 結果は下記になります。 |名前|オモチャ| |ああ|車、飛行機、自転車| |あい|車、飛行機| |あう|飛行機、自転車| マニュアル http://dev.mysql.com/doc/refman/4.1/ja/group-by-functions.html http://dev.mysql.com/doc/refman/5.1/ja/group-by-functions.html
関連質問

●質問をもっと探す●



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