【学習記録:260日目】中間テーブルのSQL文の書き方 ✖️ プログラミング

ウェブカツ

こんにちは!アラサーぱるこです。

現在、webプログラマーを目指して、プログラミングの勉強中です。

今回は9ヶ月目(前半)の定例ブログです。

昨日は、エンジニア会社さんに、1日入社体験に行って参りました。

実際の職場で一日体験できるのは、本当にいい取り組みですね。私のように転職回数が多い人間にとってはミスマッチが防げるので、とても素敵だと感じました。

昨日実際に行った体験内容は、「AWSを使って、ECサイトの機能を作ってみよう」というものでした。
内容的には、AWS以外は、ウェブカツのwebサービス部で習ったそのもので、久しぶりに生のPHPを書きました。

1日体験は、自分自身で考えてやってみるという時間が大半でしたが、定期的に色々な先輩エンジニアの方が、アドバイスやコツを教えて下さり、とても貴重な1日を過ごすことができました。

その中でも中間テーブルを使ったSQL文の書き方についてレクチャー頂いたのですが、そこで、私が今まで知らなかったmysqlの超素晴らしい機能がありました。昨日の1日体験するまで知らなかったmysqlの使い方があったの備忘録として書き留めておきます!!

中間テーブルがある場合のSQL文の書き方

では早速「中間テーブル」を使ったSQL文を書いていきましょう!!!
年末に私がLaravelで作った「フィルムカメラ日和。」のデータベースを使って実際にやってみます。

フィルムカメラ日和。
フィルムカメラで撮った写真を投稿&閲覧できるサイトです。

仕様の確認

「フィルムカメラ日和。」には、投稿時に複数タグをつけることができ、そのタグを使用してタグ検索をすることができます。それぞれのタグを選択すると、そのタグがついた写真を引っ張ってこれるようにしています。

「タグ」「投稿写真」多対多の関係になっており、中間テーブルというものを使用しております。

テーブルの確認

今回は、「posts」「post_tag」「tags」の3テーブルを使用します!

posts post_tag tags
id(PK) post_id(FK) id(PK)
title tag_id(FK) name
photo    
user_id    

SQLを実際に書いてみよう!

では、実際にあるタグを選択して、そのタグが付いた投稿写真を引っ張ってくるというSQL文を書いていきます。

まずここで昨日の一日体験で知った、mysqlの新発見機能!!!

テーブルを選んで、上の方に出てくる「インラインを編集する」という機能です!!!
この機能はなんと、mysql上で、実際に書いたSQL文がちゃんと動くか確認できるのです。

試しに、idが1が投稿した写真のみ取得してみましょう!!

SELECT * FROM posts WHERE user_id = 1

SQL文を書いて実行を押すと、

1件取得できました。このように書いたSQL文がちゃんと動くことが確認できます。

昨日で一番感動しました。今まで直接phpファイルに書いてデバッグ出してエラーしてを繰り返していました・・。
(そんなん知っとるわーという方、切り替えて中間テーブルの復習しましょう!!(笑))

取得方法

では早速本題。

「フィルムカメラ」というタグが付いている写真タイトルを取得しましょう!!

テーブルで確認をすると、今回中間テーブルを用意しているので、このような流れで取得できそうです。

中間テーブルを使ったSQL文の書き方の流れ

postsテーブルのid中間テーブルのpost_idを紐づけて結合する
tagsテーブルのid中間テーブルのtag_idを紐づけて結合する
③結合したテーブルから、タグの名前と写真のタイトルを取得する
④最後に条件を「フィルムカメラ」で取得する

では実践!

①postsテーブルのidと中間テーブルのpost_idを紐づけて結合する。

確認のために、postsテーブルのtitlepost_tagテーブルのtag_idを取得。

SELECT posts.title, post_tag.tag_id FROM `posts` 
LEFT JOIN post_tag ON posts.id = post_tag.post_id
1つの投稿に複数のタグが付いていることがわかります。

②tagsテーブルと中間テーブルのtag_idを紐づけて結合する。

確認のために、追加でtagsテーブルのnameを取得。

SELECT posts.title, post_tag.tag_id, tags.name FROM `posts` 
LEFT JOIN post_tag ON posts.id = post_tag.post_id 
LEFT JOIN tags ON post_tag.tag_id = tags.id
tagsテーブルにある、「name」も取得できたので、無事結合されたました。

③④条件をタグの名前が「フィルムカメラ」にし、写真のタイトルとタグの名前を取得

SELECT posts.title, tags.name FROM `posts` 
LEFT JOIN post_tag ON posts.id = post_tag.post_id 
LEFT JOIN tags ON post_tag.tag_id = tags.id 
WHERE tags.name = "フィルムカメラ"
フィルムカメラのタグが付いた投稿数は「7件」でした。

Laravelのアウトプットでは、中間テーブルの値を取得するためにはEloquentで書いており、実際に生のSQL文は書いたことがなかったので今回の1日体験はとても勉強になりました。

そして、mysqlのこの便利機能!!!
昨日体験に行けて本当に良かったです。企業様ありがとうございました。

p.s. 最近Eloquentばかり書いていたから、SQL文の書き方結構忘れてました。

プログラミング学習報告(9ヶ月目(前半))

9ヶ月目(前半)のプログラミングの勉強の振り返りです。
ちなみに私は、平日は10時〜19時までの会社勤務なので、平日は4時間、土日祝日は6時間を勉強時間の目標としています。
今月も、就活も合わせて行なっていたので、学習時間は少なめです。

タイトルとURLをコピーしました