###質問したいこと
SQLで情報を取得する際、JOINとWHEREの順序をどうすべきか知りたいです。
###テーブル
まずCREATE TABLE tags
には各言語のタグが入っています。
これにJOINとWHEREをかけて情報を取得します。
そしてCREATE TABLE tag_langs
とCREATE 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' )
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。