SQL - joing表 - 如果不匹配则返回null

Phi*_*son 2 mysql sql

晚上,我不确定我在这里问什么,但我会尽力解释.我不是最好的SQL,但我确实尝试...

SELECT 
    qu.job_id, qu.engineer_id, qu.id AS `quote_id`, 
    jb.author, jb.image_ref, jb.job_title 
FROM 
    `ecom_quotes` qu, `ecom_jobs` jb 
WHERE 
    jb.author = 1 
AND 
    qu.job_id = jb.image_ref
GROUP BY 
    jb.image_ref
Run Code Online (Sandbox Code Playgroud)

我使用上面的方法列出用户发布的作业,并根据作业ID从其他表中获取其他信息.

问题在于,如果作业没有为其发布引号,则不会显示(qu.job_id = jb.image_ref).

所以作为一个快速修复(或者我认为),我用它替换了它

( ( qu.job_id = jb.image_ref ) OR ( jb.image_ref != '' ) )
Run Code Online (Sandbox Code Playgroud)

哪个确实有效,但是当没有与之关联的报价时它会返回一个报价ID.

有什么我可以做的吗?

Mic*_*son 5

你会想要使用LEFT JOIN.

ecom_jobs即使没有匹配的记录,这仍将返回记录ecom_quotes.

编辑:切换表的顺序......

SELECT 
    qu.job_id, qu.engineer_id, qu.id AS `quote_id`, 
    jb.author, jb.image_ref, jb.job_title 
FROM 
    `ecom_jobs` jb
    LEFT JOIN `ecom_quotes` qu ON qu.job_id = jb.image_ref
WHERE 
    jb.author = 1
GROUP BY 
    jb.image_re
Run Code Online (Sandbox Code Playgroud)

  • 第一个查询需要`ecom_quotes`中的记录,并且如果它存在,则会在`ecom_jobs`中包含一条记录...但这与你要求的相反,所以我更改了查询以要求在`ecom_jobs中记录`,但使`ecom_quotes`中的匹配记录可选.我也可以将它从"LEFT JOIN"更改为"RIGHT JOIN"而不改变表格的顺序,但是"RIGHT JOIN"被认为是糟糕的形式. (2认同)