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
 ...