簡體   English   中英

如何使用Left Join和subquery修復SQL查詢?

[英]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) 

這是將MedicalFacilitiesIdUserstocksIdMF進行比較。 誠然,您沒有示例數據或數據布局,但是列的命名表明這些不是同一回事。 也許您打算:

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是一個隱式JOINJOIN是一個顯式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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM