[英]How to fix SQL query with Left Join and subquery?
我有LEFT JOIN的SQL查詢:
SELECT COUNT(stn.stocksId) AS count_stocks
FROM MedicalFacilities AS a
LEFT JOIN stocks stn ON
(stn.stocksIdMF = ( SELECT b.MedicalFacilitiesIdUser
FROM medicalfacilities AS b
WHERE b.MedicalFacilitiesIdUser = a.MedicalFacilitiesIdUser
ORDER BY stn.stocksId DESC LIMIT 1)
AND stn.stocksEndDate >= UNIX_TIMESTAMP() AND stn.stocksStartDate <= UNIX_TIMESTAMP())
這些查詢我想通過條件和字段等於a.MedicalFacilitiesIdUser
條件從表stocks
選擇一行。
我總是得到count_stocks = 0
的結果。 但我需要拿1
count(...)
聚合不計算null
,因此其參數很重要:
COUNT(stn.stocksId)
由於stn
是您的右手表,因此,如果left join
未命中,則此計數將不計在內。 您可以使用:
COUNT(*)
即使每一行的所有列均為null
,它也會計算每一行。 或左表( a
)中的一列永遠不會為null
:
COUNT(a.ID)
您在子查詢on
看起來很奇怪,我說:
on stn.stocksIdMF = ( SELECT b.MedicalFacilitiesIdUser
FROM medicalfacilities AS b
WHERE b.MedicalFacilitiesIdUser = a.MedicalFacilitiesIdUser
ORDER BY stn.stocksId DESC LIMIT 1)
這是將MedicalFacilitiesIdUser
與stocksIdMF
進行比較。 誠然,您沒有示例數據或數據布局,但是列的命名表明這些不是同一回事。 也許您打算:
on stn.stocksIdMF = ( SELECT b.stocksId
-----------------------------^
FROM medicalfacilities AS b
WHERE b.MedicalFacilitiesIdUser = a.MedicalFacilitiesIdUser
ORDER BY b.stocksId DESC
LIMIT 1)
同樣,通過stn.stocksid
排序不會做任何有用的事情,因為那將來自子查詢之外 。
您的子查詢似乎是多余的,主查詢很難讀取,因為許多join語句可以放在where子句中。 此外,原始查詢可能存在性能問題。
回想一下WHERE
是一個隱式JOIN
而JOIN
是一個顯式JOIN
。 如果查詢優化器使用相同的表達式,則不會在兩者之間進行區分,但是可讀性和可維護性是另一件事。
考慮修改后的版本(注意,我添加了GROUP BY
):
SELECT COUNT(stn.stocksId) AS count_stocks
FROM MedicalFacilities AS a
LEFT JOIN stocks stn ON stn.stocksIdMF = a.MedicalFacilitiesIdUser
WHERE stn.stocksEndDate >= UNIX_TIMESTAMP()
AND stn.stocksStartDate <= UNIX_TIMESTAMP()
GROUP BY stn.stocksId
ORDER BY stn.stocksId DESC
LIMIT 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.