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

以下の2つのテーブルをJoinして、最下部のようにみせるSQLを教えて下さい。people:hobbyは1:Mの関係です。MYSQL想定です。

people(table)
id(int)
name(str)
date(datetime)

hobbys(table)
id(int)
people_id(int)
hobby(str)
hobby_id(int)
date(datetime)

これらを

people.id,people.name,hobby_id[0],hobby[0],hobby_id[1],hobby[1],hobby_id[2],hobby[2]

という並びで一行で見せたい。people1人に対して、hobbyは最大3つもてる。最低でも1つのhobbyは存在する。hobbyが1つや2つの場合はnullをいれたい。

●質問者: redhat
●カテゴリ:ウェブ制作
✍キーワード:MySQL name SQL STR 存在
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● b-wind
●27ポイント

大量のサブクエリを使用しているため、非常に非効率かつ MySQL 4.1 以降で無いと使えません。

SELECT p.id,p,name
 ,( SELECT h,id FROM hobbys AS h WHERE h.people_id = p.id ORDER BY hobby_id LIMIT 1 OFFSET 0 )
 ,( SELECT h,name FROM hobbys AS h WHERE h.people_id = p.id ORDER BY hobby_id LIMIT 1 OFFSET 0 )
 ,( SELECT h,id FROM hobbys AS h WHERE h.people_id = p.id ORDER BY hobby_id LIMIT 1 OFFSET 1 )
 ,( SELECT h,name FROM hobbys AS h WHERE h.people_id = p.id ORDER BY hobby_id LIMIT 1 OFFSET 1 )
 ,( SELECT h,id FROM hobbys AS h WHERE h.people_id = p.id ORDER BY hobby_id LIMIT 1 OFFSET 2 )
 ,( SELECT h,name FROM hobbys AS h WHERE h.people_id = p.id ORDER BY hobby_id LIMIT 1 OFFSET 2 )
 FROM people AS p ;

hobby 最大3つと言うのが確定できるのでしたら、一般的にはpeople テーブルに

hobby_id0,hobby_id1,hobby_id2 というカラムを作成した方が効率はいいと思います。

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

◎質問者からの返答

副問い合わせですね。ありがとうございます。

んー非正規化されたテーブル構造のほうがよいですかね。


2 ● RIKKUN
●27ポイント

http://q.hatena.ne.jp/

URLはダミーです。

検索結果を一行で取得するのは無理なんじゃないかと思います。

select people.id,people.name,hobby_id,hobby

from people as a, hobbys as b

where a.id=1 and a.id=b.id

とかして、帰ってきた1?3行のデータをプログラム的に並べ替えてやるのが良いんじゃないかと思います。

◎質問者からの返答

やはり厳しいですか。

プログラム側でやるのは簡単ですね。


3 ● k12u
●26ポイント

前提が違っていると思いますが一応書いておきます。

select people.id, people.name, group_concat(hobby_id, hobby) from people,

hobbys where people.id = hobbys.people_id group by people.id

nullにはなりませんがお望みの物にある程度近いかと思います。

hobbyが3つ以上格納されている場合も全てgroup_concatでまとめられてしまうのも欠点です。

http://lists.mysql.com/mysql-ja/117

◎質問者からの返答

なるほど。ありがとうございます。

たしかにgroup_concatすれば可能ですね。

関連質問


●質問をもっと探す●



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