質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

2回答

645閲覧

正規化による非対称なレコードのデータを呼び出したい

chapp

総合スコア233

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

1クリップ

投稿2018/10/24 03:54

お世話になります。おかしな表題となってしまい申し訳ありません。

各個人の趣味をデータベース保存する際、以下のような形で正規化したとします。

personal
no  name
1  佐藤
2  伊藤
3  鈴木
4  中村

hobby
hobby_no  personal_no  hobby_name
1       2       読書
2       2       プログラミング
3       3       アウトドア
4       3       マラソン
5       4       プログラミング

このような時、各個人を一覧で表示させた際、hobbyレコードの昇順で一番上のデータ

佐藤
伊藤 読書
鈴木 アウトドア
中村 プログラミング

といったように表示させたいと考えています。

SELECT personal.no, personal.name, hobby.hobby_no, hobby.personal_no, hobby.hobby_name FROM personal LEFT JOIN hobby ON personal.no = hobby.personal_no ORDER BY personal.no

お恥ずかしながら、単純に上記のようにleft joinで呼出したら?と試してみましたが、hobbyの数だけ出てしまい、調べるにも適切なワードが分からず、こちらで質問板した次第です。

恐れ入りますが、適切なワード含め、アドバイスのほど頂戴出来れば幸いです。
よろしくお願い申し上げます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

  • 元データ

SQL

1create table personal(no int primary key,name varchar(20)); 2insert into personal values(1,'佐藤'),(2,'伊藤'),(3,'鈴木'),(4,'中村'); 3 4create table hobby(hobby_no int primary key,personal_no int,hobby_name varchar(20)); 5insert into hobby values(1,2,'読書'),(2,2,'プログラミング'),(3,3,'アウトドア'),(4,3,'マラソン'),(5,4,'プログラミング');
  • 集計

SQL

1select * 2from personal as t2 3left join hobby as t1 on 1 4and t1.personal_no=t2.no 5and not exists( 6select 1 from hobby where 1 7and personal_no=t1.personal_no 8and hobby_no<t1.hobby_no) 9order by no;

※今回のhobbyテーブルは本質的にはhobby_userの中間テーブルですね
本当は別途hobbyをユニークに管理するhobbyマスターテーブルが必要です。
(今回おなじプログラミングを別idで管理されているところが正規化されていない)

投稿2018/10/24 05:24

yambejp

総合スコア114814

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chapp

2018/10/24 05:29

yamnejpさん すみません。回答に気づかず、解決済みとしてしまいました。 これよりyambejpさんのSQLも試してみます。 取り急ぎ御礼まで・・・
chapp

2018/10/24 05:58

yambejpさん 期待している結果を得ること出来ました。 色々な方法があるのですね。いい勉強になりました。ありがとうございました! ※hobbyマスターテーブルが必要とのご指摘、仰る通りですね。ご指摘ありがとうございました。
guest

0

ベストアンサー

こんな感じでしょうか。もっといいのがあるかもしれませんが。
質問文については、「SQLの組み方で詰まってしまいました」ぐらいでいいんじゃないですか?
無理やり専門用語っぽいの使うと、わけがわからなくなりがちですので。

#####コード

SQL

1SELECT 2 personal.no, 3 personal.name, 4 A.hobby_no, 5 hobby.hobby_name 6FROM personal 7 LEFT JOIN ( 8 SELECT 9 min(hobby.hobby_no) as hobby_no, 10 hobby.personal_no 11 FROM hobby 12 Group BY hobby.personal_no 13 ) AS A 14 ON personal.no = A.personal_no 15 LEFT JOIN hobby 16 ON A.hobby_no = hobby.hobby_no 17ORDER BY personal.no

#####結果
|||||
|:--|:--:|--:|
|1|佐藤|||
|2|伊藤|1|読書|
|3|鈴木|3|アウトドア|
|4|中村|5|プログラミング|

投稿2018/10/24 04:39

編集2018/10/24 04:43
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chapp

2018/10/24 05:27

ppnさん お忙しい中、ご親切な対応ありがとうございます。 なるほど・・と思いながら無事解決することが出来ました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問