以下の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をいれたい。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2006/09/12 00:22:47
  • 終了:2006/09/19 00:25:03

回答(3件)

id:b-wind No.1

b-wind回答回数3344ベストアンサー獲得回数4402006/09/12 08:30:33

ポイント27pt

大量のサブクエリを使用しているため、非常に非効率かつ 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

id:redhat

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

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

2006/09/12 11:44:09
id:RIKKUN No.2

RIKKUN回答回数51ベストアンサー獲得回数12006/09/12 03:52:24

ポイント27pt

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行のデータをプログラム的に並べ替えてやるのが良いんじゃないかと思います。

id:redhat

やはり厳しいですか。

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

2006/09/12 11:43:32
id:k12u No.3

k12u回答回数80ベストアンサー獲得回数72006/09/12 14:42:34

ポイント26pt

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

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

id:redhat

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

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

2006/09/12 22:11:24

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

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

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

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

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