結合に関して本当に混乱することを尋ねる必要があります
私が思うことと、これは過去に私のために働いていたと確信していますが、何かが欠けているようです:
このクエリは、client_id が 1 である両方のテーブルからのデータを生成します - 正常に動作しています
/* gets data for one client_id*/
approach 1A
SELECT *
FROM clients LEFT JOIN client_modules
ON client_modules.client_id = clients.client_id
WHERE clients.client_id = 1;
さて、このクエリは同じ結果を返すはずだと思います。結合でサブクエリを使用して最初に結果をフィルタリングしたためです。すでに client_id 1 のモジュールからデータを取得していますが、何らかの理由で最終結果に他の client_ids データを与えています。
/* gets data for one client_id sub-query approach*/
approach 2A
SELECT *
FROM clients LEFT JOIN (SELECT client_id, module_name
FROM client_modules
WHERE client_modules.client_id = 1)
AS client_moduless ON client_moduless.client_id = clients.client_id;
/* gets data for all client_ids */
approach 1B
SELECT * FROM clients
LEFT JOIN client_modules ON client_modules.client_id = clients.client_id;
/* gets data for all client_ids*/
approach 2B
SELECT *
FROM clients LEFT JOIN (SELECT client_id, module_name
FROM client_modules) AS client_moduless
ON client_moduless.client_id = clients.client_id;
質問:
1) 大量のデータを使用する場合、どのアプローチがより効率的xA and xB
ですか?
2) サブクエリを join で個別に実行しても問題なく動作するのに、2 番目のアプローチ2A
で結果が得られるのはなぜですか?client_ids other then 1
3) 2B
where句を使用しない場合、親からのすべてのレコードに対してサブクエリが実行されますか?
4) 1A クエリを次のように変更するとどうなりますか?
SELECT * FROM clients
JOIN client_modules ON client_modules.client_id = clients.client_id AND client_modules.client_id = 1
クライアントテーブルのwhere句を削除し、子テーブルの結合句にこれを効率的またはwhere句に入れましたか?
よろしく