我有以下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