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

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

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

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

Q&A

解決済

3回答

2574閲覧

SQLのINNER JOINがうまくいかないです

mousuguharudesu

総合スコア8

SQL

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

0グッド

0クリップ

投稿2020/03/23 11:16

以下のようにcontents(コンテンツのテーブル)とhistories(閲覧履歴のテーブル)があるとして、results(目的の取得結果)はどのようにすれば得られますか?

▼ contents(コンテンツのテーブル)

content_idval
1val1
2val2
3val3
4val4
5val5
6val6

▼ histories(閲覧履歴のテーブル)

history_iduser_idtarget_content_idvisit_date
15362020-01-05
24132020-01-04
35322020-01-03
47882020-01-02
56642020-01-01

▼results(目的の取得結果)
|content_id|val|visit_date|
|:--|:--|
6|val6|2020-01-05|
2|val2|2020-01-03|

つまり、53さんの閲覧履歴を取得するのが目的です。

書いてみたのが下のSQLですが、そのように取得できませんでして、初心者で申し訳ございませんが、どうやったらいいのか教えて頂けませんでしょうか。

sql

1select c.content_id, c.val, h.visit_date 2from contents c 3join 4 select target_content_id 5 from histories h 6 where h.user_id=53 7 on h.target_content_id=c.ID

joinの中だけ実行すれば下のようになり、これは6と2が取得できるので、問題はjoinにあるのではと思っているのですが、いまいち理解が進まずわからない状況です。

SQL

1 select target_content_id 2 from histories 3 where actor_id=53

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

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

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

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

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

Orlofsky

2020/03/23 11:26

同じSQLでもデータベースやそのバージョンによって方言が大きいですから、どのデータベースを使うのかを質問のタグで示したり、バージョンも明記した方が適切なコメントが付き易いです。
guest

回答3

0

SQL

1select t1.content_id,t1.val,t2.visit_date date 2from contents as t1 3inner join histories as t2 4on t2.user_id=53 5and t2.target_content_id=t1.content_id

投稿2020/03/23 11:29

yambejp

総合スコア114823

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

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

mousuguharudesu

2020/03/23 12:10

ありがとうございます。みなさん同じ方向性のようで安心致しました。joinにはサブクエリのselectはいらなかったのですね。
guest

0

ベストアンサー

DBにもよりますが大体この書き方ならどれでも使えると思います。
そもそもIDってカラムないですよね。

sql

1select 2 c.content_id, 3 c.val, 4 h.visit_date 5from contents c 6inner join histories h on 7h.target_content_id = c.content_id 8where 9 h.user_id=53

投稿2020/03/23 11:28

yureighost

総合スコア2183

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

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

mousuguharudesu

2020/03/23 12:07

どうもありがとうございます。質問のコードに近くて上手くいくコードでしたのでベストアンサーにさせて頂きました。
guest

0

SQL

1select c.content_id, c.val, h.visit_date 2from contents c 3inner join histories h 4on h.target_content_id = c.ID 5where h.user_id = 53

SQLで使われるテーブルはCREATE TABLEされている必要があります。
質問のテーブル定義の説明もCREATE TABLEに変更して、
SELECTされるデータもINSERTされている必要がありますから、INSERT文に変更してもらえると適切なコメントが付き易いです。

投稿2020/03/23 11:25

Orlofsky

総合スコア16415

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

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

mousuguharudesu

2020/03/23 12:09

ありがとうございます。僕のせいで「c.ID」などと書かせてしまってすみません。CREATE TABLEは使ったことがないので至らず申し訳ございません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問