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

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

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

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

SQL

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

Q&A

解決済

2回答

2400閲覧

select *... left join を使った時に、カラムの重複を回避したい

MagMag

総合スコア80

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/10/29 06:41

下に記載した3つの表の上2つの表のように、レシピテーブルとレシピの評価テーブルがあります(両テーブル対応は1対1)。

このとき、以下のクエリーで両テーブルを結合しようと思っています。
(実際、レシピテーブルは縦持ちにしていますが、つなげるために横持ち変換したものを表示しています)

MySql

1select * from recipe as r left join (select * from eval) as e on r.レシピ名 = e.レシピ名

このクエリーを叩くと、一番下の表のようになり、同じ情報を持つ「レシピ名」が2列発生してしまうので、これを1列にできないでしょうか?

select の変わりに表示すべき全ての列名を列挙する方法が選択肢であることはわかるのですが、カラム数が多いので、直接記述は避けたいと思っています。データベース利用目的がアドホックなデータ解析であるため、(素人視点ですが)非明示なを使っても副作用は少ないと考えています。




レシピ(recipe)テーブル
|レシピ名|人参|じゃがいも|大根|豚肉|牛肉|
|:--|:--:|--:|
|カレー|50g|100g|0g|0g|100g|
|豚汁|30g|20g|20g|20g|0g|


評価(eval)テーブル

レシピ名Aさん評価Bさん評価
カレー80点20点
豚汁70点30点

クエリー結果 →レシピ名の重複を1つにしたい。
|a.レシピ名|人参|じゃがいも|大根|豚肉|牛肉|r.レシピ名|Aさん評価|Bさん評価|
|:--|:--:|--:|
|カレー|50g|100g|0g|0g|100g|カレー|80点|20点|
|豚汁|30g|20g|20g|20g|0g|豚汁|70点|30点|

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

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

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

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

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

m.ts10806

2020/10/29 06:43

テーブル定義をCREATE TABLE文で提示してください。
pekopekoapricot

2020/10/29 06:50

動作確認してないですがこんな書き方出来ませんでしたっけ 「SELECT r.*, e.Aさん評価, b.Bさん評価 FROM~」
guest

回答2

0

ベストアンサー

同じ情報を持つ「レシピ名」が2列発生してしまうので、これを1列にできないでしょうか?

select * ではなく、追加で必要な項目を列挙して下さい。
重なっている所だけ、優先する命令はありません。
それが嫌なら、表示の際に除去するしかありませんが、それでもカラムを調べる必要があります。

postgresなら構造体を利用する事で多少省略は出来ますが。

シピテーブルは縦持ちにしていますが、つなげるために横持ち変換したものを表示しています

この横にする際は項目を意識しているんでしょうから、そこで結合すれば良い話ではないでしょうか。

投稿2020/10/29 06:47

編集2020/10/29 06:56
sazi

総合スコア25327

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

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

MagMag

2020/10/29 09:59 編集

ありがとうございました(いつもありがとうございます)。前半部分は承知しました。 >この横にする際は項目を意識しているんでしょうから、そこで結合すれば良い話ではないでしょうか。 縦持ちのレシピテーブルに評価テーブルをJOINしたらいいという意味でしょうか? 最終的に活用するのは一番下表の、1行1レシピ+評価とするテーブルになります。縦持ちのレシピテーブルに評価テーブルをJOINさせたものを、3つめの表のように横持ちさせるには、SQLのどういった機能を使えばよろしいでしょうか?(質問を重ねてしまい、恐縮です) ちなみに、レシピテーブルの列も、評価テーブルの列も横持ちでは数十列あります。
sazi

2020/10/29 12:35 編集

> 縦持ちのレシピテーブルに評価テーブルをJOINさせたものを、3つめの表のように横持ちさせるには、SQLのどういった機能を使えばよろしいでしょうか? この質問になるという事は、 > レシピテーブルは縦持ちにしていますが、つなげるために横持ち変換 上記は未実装という事ですか? > カラム数が多いので、直接記述は避けたい 実装されているなら、その多くのカラムを作り出す編集を行っているはずだから、多少の項目の編集が増えてもあまり変わりないという意図です。
MagMag

2020/11/04 00:52

sazi様 回答が遅くなってしまって申し訳ありません。 >> レシピテーブルは縦持ちにしていますが、つなげるために横持ち変換 > 上記は未実装という事ですか? 横持ち時のカラム数が多く(レシピテーブルで言えば、材料種が72)、SQLで全カラムを一つ一つ記述する以外の縦持ち→横持ちへの変換方法がわかりませんでした。そのため、Python上で縦持ちから横持ちに変換しています。
sazi

2020/11/04 01:52

では、結合して取得した後で、縦横変換ですね。
MagMag

2020/11/04 06:19 編集

実際には両方横持ちに変換してpythonで結合しています。 というのも、これらのテーブル以外に原料テーブルがあり、にんじんのカロリーは80kcalなど、原料のデータがあって、これも結合したいと考えています。そのため、縦持ち同士で結合してしまうと、レシピに紐づくデータ(カレーはAさん評価80点など)と、原料に紐づくデータ(にんじんはカロリー80kcalなど)が同一テーブルに入ってしまい、その後、この両者を区別してうまくピボットができない状態です。 本当はpythonを使わず、SQLで完結したいのですが、どこがわかっていないのか整理して調べてみて、わからなければ別のスレッドで質問させていただけたらと思います(多分SQLでたくさんカラムを持つデータでの縦横変換だと思います)。 丁寧にご回答いただき、ありがとうございました!
guest

0

evalをサブクエリっぽくつかっている意味がわかりません

SQL

1select r.*,Aさん評価,Bさん評価 from recipe as r left join eval as e using(レシピ名)

投稿2020/10/29 07:04

yambejp

総合スコア116724

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

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

yambejp

2020/10/29 07:05

saziさんの指摘がある通り、カラム名はひとつひとつ具体的に列記するのが正しいです。
MagMag

2020/10/29 09:57

ありがとうございます。サブクエリでなく、テーブルごとつなげられることは知りませんでした。また、using()も知らなかったので勉強になりました。
sazi

2020/10/29 12:31

natural joinでも結合項目を省略可。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問