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

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

新規登録して質問してみよう
ただいま回答率
85.48%
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回答

571閲覧

SQLで、指定したものをJOINするか、全てJOINしてからWHEREで指定するか

nyuuinkanja

総合スコア8

MySQL

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

SQL

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

0グッド

2クリップ

投稿2020/04/01 04:20

###質問したいこと
SQLで情報を取得する際、JOINとWHEREの順序をどうすべきか知りたいです。

###テーブル

まずCREATE TABLE tagsには各言語のタグが入っています。
これにJOINとWHEREをかけて情報を取得します。

そしてCREATE TABLE tag_langsCREATE TABLE langsにはタグの言語が入っています。
例えばユーザーのメイン言語が日本語なら、lang_nameカラムがjaのタグのみ取得します。

CREATE TABLE tags (`tag_id` int, `name` varchar(100), `slug` varchar(100)) ; INSERT INTO tags (`tag_id`, `name`, `slug`) VALUES (1, 'red', 'red'), (2, '青', 'blue'), (3, 'зелень', 'green') ; CREATE TABLE tag_langs (`object_id` int, `tag_id` int, `lang_id` int) ; INSERT INTO tag_langs (`object_id`, `tag_id`, `lang_id`) VALUES (1, 1, 1), (2, 2, 1), (3, 3, 3), (4, 1, 2) ; CREATE TABLE langs (`lang_id` int, `lang_name` varchar(10)) ; INSERT INTO langs (`lang_id`, `lang_name`) VALUES (1, 'ja'), (2, 'en'), (3, 'ru') ;

###該当のコード
つまりユーザーのメイン言語が日本語なら、「red」と「青」だけ取得したいのでえす。
英語はどの言語も共通で取得し、プラスその言語のタグを取得するという感じです。

そのためのコードを以下2通り考えたのですが、みなさんは、なぜ、どちらで取得しますか?(tagsは100万行あるとします)

前者はすべてJOINしてからWHEREでフィルターをかけるという流れですが、すべてJOINされるので「100万行✕言語」をまず作るという点がよくなさそうに感じます。

後者は先にjaのものに絞ってからINNER JOINしているのでいいかと思っているのですが、読みにくいかとも思います。

どちらが適切、ないし皆様の好みでしょうか?

SELECT t.tag_id, t.name, t.slug FROM tags t LEFT JOIN tag_langs tl ON tl.tag_id=t.tag_id LEFT JOIN langs l ON l.lang_id=tl.lang_id WHERE l.lang_name='ja'
SELECT t.tag_id, t.name, t.slug FROM tags t WHERE t.tag_id IN ( SELECT tag_id FROM tag_langs tl INNER JOIN langs l ON l.lang_id=tl.lang_id AND l.lang_name='ja' )

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

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

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

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

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

guest

回答1

0

インデックスは適切に設定されているものとして、同類の質問 の最後のコメントが役に立つでしょう。

投稿2020/04/01 05:33

Orlofsky

総合スコア16415

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問