我需要问一些真正令人困惑关于加入MySQL的加入+子查询混乱
我想什么,我相信这为我所用过去的工作,但好像是缺少了一些东西:
此查询结果在两个表中,其中的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)为什么是第二个方法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子句?即从左侧的所有记录,但只能从右侧相关的记录 - 因为你已经使用了左连接
问候
用于识别'LEFT JOIN'我知道这一点,但这是我错过了:),但是子查询与直接连接表名有什么关系?任何想法? – Junaid
更新了答案 – Arion
赞赏!请参阅更新后的问题 – Junaid