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

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

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

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

Q&A

1回答

1181閲覧

[sql]テーブル同士の結合方法

退会済みユーザー

退会済みユーザー

総合スコア0

SQL

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

0グッド

0クリップ

投稿2018/09/30 08:22

編集2018/09/30 10:50

###magazineテーブル
|id|title|category|price|
|:--|:--:|
|1|sample_title1|1|500円|
|2|sample_title2|2|2000円|
|3|sample_title3|1|1000円|

###bookテーブル
|id|title|history|like|magazine_id|
|:--|:--:|
|1|sample_movie_title1|2018|1|1
|2|sample_movie_title2|2001|0|1
|3|sample_movie_title3|2016|1|1
|4|sample_movie_title4|2011|0|1

#理想のまとめ方

idtitlehistorylikemagazine_idbook_idtitlecategoryprice
1sample_title1nullnull1nullsample_title11500円
2sample_movie_title12018111nullnullnull
3sample_movie_title22001011nullnullnull
4sample_movie_title32016111nullnullnull
5sample_movie_title42011011nullnullnull

#例示追加 as book_title した場合。

idtitlehistorylikemagazine_idbook_idbook_titlecategoryprice
1nulnullnull1nullsample_title11500円
2sample_movie_title12018111nullnullnull
3sample_movie_title22001011nullnullnull
4sample_movie_title32016111nullnullnull
5sample_movie_title42011011nullnullnull

上記のようにテーブルを一つにまとめたいのですが可能でしょうか?
left join
outer join
right join
union

select * from book left join magazine m on book.magazine_id = m.id

select * from book left outer join magazine m on book.magazine_id = m.id

select * from book join magazine m on book.magazine_id = m.id

select * from book union all select * magazine

などを試しましたがことごとく失敗です。

##お力をお借りできたらと思っています。
よろしくお願いします。

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

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

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

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

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

m.ts10806

2018/09/30 09:06

Laravel5というより単にSQLの案件では?
退会済みユーザー

退会済みユーザー

2018/09/30 09:58

タグの付け違いでしたね。すみません。それでわかりますか?
m.ts10806

2018/09/30 10:28

これはタグではなくタイトルでは。
退会済みユーザー

退会済みユーザー

2018/09/30 10:31

全て修正しました。 それでは本題の方の回答もいただけますか!
m.ts10806

2018/09/30 10:36

DBの種類とバージョン、あとtitle重複してますがどうしますか?
退会済みユーザー

退会済みユーザー

2018/09/30 10:41

DBの種類はMySql です。 titleですがbookテーブルとmagazineテーブルの混合にしたいです。 よろしくお願いします。
m.ts10806

2018/09/30 10:46

「混合」というのは例示にあるように同列ということですよね?「book_id」とされているのである程度理解はされているかと思いますが、同名だとSELECTが通りませんのでbook_titleとするか、そうでないなら例示の表を編集して実際実現したい形を具体的にしてください。
退会済みユーザー

退会済みユーザー

2018/09/30 10:49

おっしゃる通り、同列です。もしくは新たに追加したような例示でも可能です。
m.ts10806

2018/09/30 11:35

まさにそこですよ。JOINしているが、同名カラムがあるから提示したSQLではできないわけです。 * ではなく1つ1つカラムを指定していったらいいですよ。as カラム別名をご存知なので自己解決可能な内容です。
m.ts10806

2018/09/30 11:50

試した結果が提示されていないのでわからないですが、おそらく同名カラムによるエラーがほとんどのはずです。
guest

回答1

0

SELECT @i := @i + 1 id,title,history,`like`,magazine_id,book_id,book_title,category,price FROM ( select @i := 0 ) A, ( SELECT magazine.title,null history,null `like`,magazine.id magazine_id,null book_id,magazine.title book_title,magazine.category,magazine.price FROM magazine WHERE EXISTS (SELECT 1 FROM book WHERE magazine.id=book.magazine_id) UNION ALL SELECT book.title,book.history,book.`like`,book.magazine_id,book.id,null,null,null FROM book JOIN magazine ON book.magazine_id=magazine.id ORDER BY magazine_id,book_id ) B

このような感じでいかがでしょうか?
理想のまとめ方のbook_idはすべて1になっていましたがbookテーブルのidにしています。
likeは予約語なので変更したほうがいいと思います。
データ量が多くなると遅くなりそうです。

トリッキーなSQLになるので、可能であれば設計を見直されることをお勧めします。

投稿2018/10/01 00:26

tabuu

総合スコア2449

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問