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

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

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

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

SQL

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

Q&A

解決済

1回答

621閲覧

結合後の同テーブル同フィールドの別レコードsqlの抽出が出来ない

hiroshi77

総合スコア12

MySQL

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

SQL

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

0グッド

0クリップ

投稿2020/11/21 00:59

【達成したいこと】
下記の2つのテーブルがあった場合に、本人のIDをキーに、その本人の友達の分配率を1行で抽出したい。
例えば、ID 21 が指定されたら、下記のように抽出したいのですが、
自分でいくつも試みても、上手く1行で抽出できなくて苦戦しています。
良い方法があれば、ご教授頂ければ幸いです。

求めたい結果(ID21)

友達1の分配率友達2の分配率友達3の分配率
2.63(Null)

既存テーブル

友達テーブル(user)
|本人ID|名前|友達1のID(f1_id)|友達2のID(f2_id)|友達3のID(f3_id)
|:--:|--:|
|20|tanaka|1|2|3|
|21|yoshida|4|5|(Null)|

友達分配レート テーブル(friend_rate)

友達ID(id)分配率(rate)
11.5
22
32.5
42.6
53

[試したこと]

友達テーブルと、友達分配レートテーブルの結合テーブルを3つ作り、それぞれのテーブルから
分配率を抽出。
結果 → ID20については、上手くいきましたが、nullのあるID30について試みると何も抽出できませんでした。
(別々に結合テーブルを作っているつもりなのですが、その別々のテーブルが結合されてしまって、friend3は結果がnullなので、抽出ができないという結果になるのでしょうか)

SET @target_id = 21;

select friend1.rate as 友達分配1, friend2.rate as 友達分配2,friend3.rate as 友達分配3 from
(select rate from friend_rate inner join user
on friend_rate.id = user.f1_id where userinfo.id = @target_id) as friend1,
(select rate from friend_rate inner join user
on friend_rate.id = user.f2_id where userinfo.id = @target_id) as friend2,
(select rate from friend_rate inner join user
on friend_rate.id = user.f3_id where userinfo.id = @target_id) as friend3;

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

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

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

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

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

yambejp

2020/11/21 01:24

テーブルの例示をcreate table+insert で行ってください また分配率(?)の計算ロジックを説明してください
hiroshi77

2020/11/21 02:23

テーブルの例示をcreate table+insert で行ってください → 新たにテーブルを作るということでしょうか? テーブルの例示をcreate table+insert で行ってください また分配率(?)の計算ロジックを説明してください → 既存の分配率を抽出したいだけですので、ここでは得にロジックは考えないでいただいて結構です。
guest

回答1

0

ベストアンサー

私なら↓こう書きます。

sql

1SELECT U.id, U.name, FR1.rate, FR2.rate, FR3.rate 2FROM user U 3 LEFT JOIN friend_rate FR1 4 ON FR1.id=U.f1_id 5 LEFT JOIN friend_rate FR2 6 ON FR2.id=U.f2_id 7 LEFT JOIN friend_rate FR3 8 ON FR3.id=U.f3_id 9WHERE U.id=21

friend3は結果がnullなので、抽出ができないという結果になるのでしょうか

そうですね。
このクエリの構造は、SELECT ... FROM friend1, friend2, friend3となってますよね。この場合、3テーブルの直積が返ります。直積というのは、それぞれのテーブルの全行の組み合わせ、ということです。仮に、それぞれの行数が、3行、2行、5行なら、30行が返るわけです。ID=21の場合、1行、1行、0行なので、結果は0行ですね。

投稿2020/11/21 01:29

gpsoft

総合スコア1323

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

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

hiroshi77

2020/11/21 02:27 編集

ご回答ありがとうございます。 上記のとおり試したところ、 21 yoshida 2.6 3 null という結果を得られました。 ありがとうございます!
hiroshi77

2020/11/21 02:37 編集

userテーブルを左の軸において、各友達のidをキーに分配テーブルを右につなげていき、 各userごとの、結合レコードを作成し、 最後にuser のidで絞り込んだのですね。 とても勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問