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



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


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

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


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


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

あい
→車、飛行機

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


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

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

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2012/11/17 08:33:10
  • 終了:2012/11/17 12:39:15

ベストアンサー

id:windofjuly No.2

うぃんど回答回数2625ベストアンサー獲得回数11492012/11/17 10:49:01

ポイント100pt

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

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

結果

名前ソートオモチャ
ああああ自転車
 ああ
 ああ飛行機
あいあい
 あい飛行機
あうあう自転車
 あう飛行機
他2件のコメントを見る
id:robopit

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

2012/11/17 12:38:45
id:windofjuly

大幅訂正です。すみません。

回答No.1に変な方向に誘導されてました。
この問題への回答は非常にカンタンでした。

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

2012/11/17 12:56:31

その他の回答(1件)

id:oil999 No.1

oil999回答回数1728ベストアンサー獲得回数3202012/11/17 09:55:27

ポイント5pt

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

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

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

2012/11/17 11:53:21
id:windofjuly No.2

うぃんど回答回数2625ベストアンサー獲得回数11492012/11/17 10:49:01ここでベストアンサー

ポイント100pt

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

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

結果

名前ソートオモチャ
ああああ自転車
 ああ
 ああ飛行機
あいあい
 あい飛行機
あうあう自転車
 あう飛行機
他2件のコメントを見る
id:robopit

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

2012/11/17 12:38:45
id:windofjuly

大幅訂正です。すみません。

回答No.1に変な方向に誘導されてました。
この問題への回答は非常にカンタンでした。

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

2012/11/17 12:56:31
  • id:Mook
    MySQL であれば GROUP_CONCAT が使えないですか?
    http://dev.mysql.com/doc/refman/4.1/ja/group-by-functions.html
  • id:windofjuly
    うぃんど 2012/11/17 13:09:29
    Mookさんのコメントのほうが早かったですねorz

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

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

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

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