質問するログイン新規登録

Q&A

解決済

2回答

2436閲覧

親子関係のレコードを1度にまとめてSELECTしたい

ID_7UGzV8hCHGs5

総合スコア58

MySQL

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2023/07/20 05:39

編集2023/07/20 12:32

0

0

実現したいこと

idを元にSELECTしたレコードと、
そのレコードの parent_idを持つレコード
の2行を 1回のクエリで同時にSELECT する事は可能でしょうか。

(googleで何と検索すれば いいでしょうか。)

例:
下記のテーブルにて、id=3 を元にしたとすると、

まず、くだもの レコードがSELECTされます。
くだもの レコードの parent_id は 1 なので、
id = 1 である、食べ物 レコード をSELECTします。

この時、くだもの レコードと、食べ物レコード の 2行を1回のクエリで取得したいです。

idparent_iddata
1null食べ物
2null乗り物
31くだもの
41お菓子

▽取得したい配列の形

[ [ 'id'=>3 'parent_id'=>1, 'data'=>'くだもの' ], [ 'id'=>1 'parent_id'=>null, 'data'=>'食べ物' ], ]

試したこと

下記のコードでは、とある子供レコードの親レコードの取得はできますが、子供レコードが取得できなくて困っています。

sql

1SELECT t2.* 2FROM `main` t1 3JOIN `main` t2 ON t1.id = t2.parent_id 4WHERE t1.id = 3;

まとめ(メモ)

教えて頂いた方法を使って、下記のようにして、親、子供、孫 の3レコード取得が出来ました。
※実際のテーブルには最大5階層あるため、下記のようなsqlを階層の分、PHPで生成する形になりそうです。

sql

1select * 2 from main 3 where id = 31 4 or id = (select parent_id 5 from main 6 where id = (select parent_id 7 from main 8 where id = 31)) 9 or id = (select parent_id 10 from main 11 where id = 31)

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

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

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

logres_Fan

2023/07/20 06:00

> WHERE t1.id = 3 WHERE t2.id = 3に変えると、何か変わりますか?
ID_7UGzV8hCHGs5

2023/07/20 12:00

ありがとうございます。 提案して頂いた通り下記のようにい変更してみると、 ```sql SELECT t2.* FROM `main` t1 JOIN `main` t2 ON t1.id = t2.parent_id WHERE t2.id = 3; ``` id=3 である くだものレコードが 1行SELECTされました。
guest

回答2

0

ベストアンサー

sql

1select * 2 from main 3 where id = 3 4 or id = (select parent_id 5 from main 6 where id = 3);

投稿2023/07/20 07:33

takanaweb5

総合スコア367

ID_7UGzV8hCHGs5

2023/07/20 12:24

教えて頂いたSQLでできました。ありがとうございます。
guest

0

SQL

1create table tbl(id int primary key,pid int null,data varchar(20)); 2insert into tbl values 3(1,null,'食べ物'), 4(2,null,'乗り物'), 5(3,1,'くだもの'), 6(4,1,'お菓子'); 7 8select * from tbl where 1 in(id,pid)

ただし今回のように親idを保持するような管理テーブルの場合、木構造で入れ子が複雑になってくるとテーブルの構造を変更する必要がでてきます
プロシージャなどで入れ子集合モデルでのテーブル拡張を検討ください

投稿2023/07/20 05:50

編集2023/07/20 06:14
yambejp

総合スコア118439

ID_7UGzV8hCHGs5

2023/07/20 12:22

検証までしていただきありがとうございます。 >入れ子集合モデル こちらについてちょっと調べてみました。非常に面白いアイディアですね 難しそうですが勉強してみますっ
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.25%

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

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

質問する

関連した質問