MySQL:如果联接期间缺少表行,则“忽略”
我在三个表上进行左连接,其中表时间不一定包含任何匹配行。但如果在该表中找不到匹配的行,则链接的数据将消失MySQL:如果联接期间缺少表行,则“忽略”,mysql,left-join,Mysql,Left Join,我在三个表上进行左连接,其中表时间不一定包含任何匹配行。但如果在该表中找不到匹配的行,则链接的数据将消失 SELECT w.date AS worker_date, w.name AS worker_name, w.address AS worker_address, w.zip AS worker_zip, w.place AS worker_place, w.phone AS worker_phone, w.email AS worke
SELECT
w.date AS worker_date,
w.name AS worker_name,
w.address AS worker_address,
w.zip AS worker_zip,
w.place AS worker_place,
w.phone AS worker_phone,
w.email AS worker_email,
w.company AS worker_company,
w.accessibility AS worker_accessibility,
c.date AS client_date,
c.name AS client_name,
c.address AS client_address,
c.zip AS client_zip,
c.place AS client_place,
c.phone AS client_phone,
c.email AS client_email,
c.web AS client_web,
c.contact AS client_contact,
j.date AS job_date,
j.client_id,
j.worker_id,
j.name AS job_name,
j.description AS job_description,
j.type AS job_type,
j.status AS job_status,
j.proof AS job_proof,
j.deadline AS job_deadline,
j.price AS job_price,
j.final_client AS job_final_client,
SUM(t.hours) AS time_hours
FROM
jobs AS j
LEFT JOIN (
workers AS w,
clients AS c,
time AS t
) ON (
w.id = j.worker_id AND
c.id = j.client_id AND
j.id = t.job_id
) GROUP BY
j.id;
我怎样才能做到这一点
提前谢谢。添加
其中,t.job_id在GROUP BY之前不为NULL
试着替换
总时数作为时间
到
选择IFNULLSUMt.hours,从time.job\u id=j.job\u id的时间起0作为time\u hours
并从连接中删除时间我认为您的基本查询对于大括号下的连接是正确的 替换
SUM(t.hours) AS time_hours
与
我不确定这是否是问题所在,但在某个MySQL版本之后,逗号与连接的行为发生了变化。试试这个
...
FROM jobs AS j LEFT JOIN workers AS w ON w.id = j.worker_id
LEFT JOIN clients AS c c.id = j.client_id
LEFT JOIN `time` AS t ON j.id = t.job_id
...
按照@ajreal的建议,也可以使用IFNULL修改总和。您必须澄清这一点-如果与时间表不匹配,应及时给出什么值_hours@sandeepan:那么我想要一个0作为时间,而不是一个完整的丢失记录。你确定完整的记录丢失了吗?您使用的是左连接,如果时间表中没有匹配项,则记录不会丢失。现在,它将从结果中完全删除该项。我想我已经测试过了,但显然没有-它有效!在这种情况下,内部选择是一个有效的解决方案还是仅仅是一次走走?取决于您的需求。如果您不需要表来进行一些约束检查,您可能应该跳过加入表。您可以使用explain to SQL,如果您的mysql版本高于5.0.37,您可以使用profiling检查查询速度-@ajreal为什么需要从联接中删除表时间?@ajreal ok了解,您正在子查询中执行条件检查。这也将给出正确的结果
...
FROM jobs AS j LEFT JOIN workers AS w ON w.id = j.worker_id
LEFT JOIN clients AS c c.id = j.client_id
LEFT JOIN `time` AS t ON j.id = t.job_id
...