如何合并两个表中的数据,包括没有匹配项的字段


How to merge data from 2 tables including fields that have no match

我有以下MySQL语句:

SELECT gls.id AS glid, gls.gl, gls.name AS gl_name, requests.costCenter, budgets.total as totalBudgeted,
                    ROUND(SUM(CASE WHEN requests.ap = 1 THEN totalCost ELSE 0 END), 2) AS ap1, 
                    ROUND(SUM(CASE WHEN requests.ap = 2 THEN totalCost ELSE 0 END), 2) AS ap2,
                    ROUND(SUM(CASE WHEN requests.ap = 3 THEN totalCost ELSE 0 END), 2) AS ap3,
                    ROUND(SUM(CASE WHEN requests.ap = 4 THEN totalCost ELSE 0 END), 2) AS ap4,
                    ROUND(SUM(CASE WHEN requests.ap = 5 THEN totalCost ELSE 0 END), 2) AS ap5,
                    ROUND(SUM(CASE WHEN requests.ap = 6 THEN totalCost ELSE 0 END), 2) AS ap6,
                    ROUND(SUM(CASE WHEN requests.ap = 7 THEN totalCost ELSE 0 END), 2) AS ap7,
                    ROUND(SUM(CASE WHEN requests.ap = 8 THEN totalCost ELSE 0 END), 2) AS ap8,
                    ROUND(SUM(CASE WHEN requests.ap = 9 THEN totalCost ELSE 0 END), 2) AS ap9,
                    ROUND(SUM(CASE WHEN requests.ap = 10 THEN totalCost ELSE 0 END), 2) AS ap10,
                    ROUND(SUM(CASE WHEN requests.ap = 11 THEN totalCost ELSE 0 END), 2) AS ap11,
                    ROUND(SUM(CASE WHEN requests.ap = 12 THEN totalCost ELSE 0 END), 2) AS ap12 
                FROM gls
                    LEFT JOIN requests ON requests.glid = gls.id 
                    LEFT JOIN budgets ON budgets.gl = gls.id AND budgets.costCenter = 2
                WHERE requests.status = 'approved' AND requests.costCenter = 2
                    GROUP BY gls.id

我的问题是,当我运行查询时,我只得到有链接到它们的请求的"gl"。请求表中没有相应条目的"gl"不会显示。

我尝试了几种JOIN排列,但似乎都不起作用。对我来说,限制因素是LEFT JOIN requests ON requests.glid = gls.id,它阻止了所有GL的显示,但据我所见,LEFT JOIN应该保留所有GL表的值,并且只添加相应的REQUESTS值。

出于隐私原因,我不能显示任何数据,但我可以尝试总结一下:

在gls表中有30行,

在requests表中,可以有任意数量的行,但每一行都有一个外键将它们链接到gls表中的一行。基本上,我的查询应该给我一个所有gls的表,并标记旁边相应请求的信息

此外,我有一种感觉,这里的人将能够清理这个查询,并使其更短。

谢谢大家!

您对LEFT JOIN的看法是正确的。问题是你的位置:

WHERE requests.status = 'approved' AND requests.costCenter = 2

这会过滤掉所有没有请求的行。

相反,您希望将该条件移动到JOIN:

LEFT JOIN requests 
  ON requests.glid = gls.id 
 AND requests.status = 'approved' AND requests.costCenter = 2