我有一个带有一些连接的查询,这些连接从多个表返回数据
SELECT A.ItemID, A.Title, A.PictureURL as Image, SUM(B.AmountPaid) as revenue, COUNT(*) AS numOrders, B.CheckoutStatus_LastModifiedTime, C.HitCount as today, D.HitCount as yesterday
FROM ebay_activelistings A
LEFT JOIN ebay_orders B ON
A.ItemID = B.ItemID
AND ( (B.CheckoutStatus_LastModifiedTime >= :start_date
AND B.CheckoutStatus_LastModifiedTime < :end_date) OR B.CheckoutStatus_LastModifiedTime IS NULL)
AND (B.CheckoutStatus_Status = 'Complete' OR B.CheckoutStatus_Status IS NULL)
LEFT JOIN ebay_hitswatches C ON A.ItemID = C.ItemID
LEFT JOIN ebay_hitswatches D ON A.ItemID = D.ItemID
WHERE
A.ListingStatus = 'Active'
AND C.Timstamp LIKE :end_date2
AND D.Timstamp LIKE :start_date2
" . (count($listingIds) > 0 ? 'AND A.ItemID IN ('.implode(',', $listingIds).')' : '') . "
GROUP BY A.ItemID
此查询工作正常,如果在“ebay_orders”表中找到匹配的“ItemID”,则只会从“ebay_activelistings”表返回一行。
但是,无论如何,我想返回一行,即使“ebay_orders”中没有匹配的“ItemID”,然后是“B”。数据可以留空,但我仍然得到一行包含其他数据的数据。
任何帮助将不胜感激,谢谢。
最佳答案
您已使用 LEFT JOIN 保留 A 中的行,即使它们在 B、C 或 D 中没有相应的元素。
但是,如果您的 WHERE 子句中有与 B、C 或 D 相关的条件,那么这些行将从您的答案中删除。
将与 B 或 C 或 D 相关的条件放入 JOIN 条件中可将这些条件保留在您的最终答案中。
简短回答 - 将 WHERE 条件移至 JOIN 条件。
SELECT A.ItemID, A.Title, A.PictureURL as Image, SUM(B.AmountPaid) as revenue, COUNT(*) AS numOrders, B.CheckoutStatus_LastModifiedTime, C.HitCount as today, D.HitCount as yesterday
FROM ebay_activelistings A
LEFT JOIN ebay_orders B ON
A.ItemID = B.ItemID
AND ( (B.CheckoutStatus_LastModifiedTime >= :start_date
AND B.CheckoutStatus_LastModifiedTime < :end_date) OR B.CheckoutStatus_LastModifiedTime IS NULL)
AND (B.CheckoutStatus_Status = 'Complete' OR B.CheckoutStatus_Status IS NULL)
LEFT JOIN ebay_hitswatches C ON A.ItemID = C.ItemID AND C.Timstamp LIKE :end_date2
LEFT JOIN ebay_hitswatches D ON A.ItemID = D.ItemID AND D.Timstamp LIKE :start_date2
WHERE
A.ListingStatus = 'Active' $itemClause
GROUP BY A.ItemID
但是...在您的 php 中按如下方式设置 $itemClause - 这将是空白或包含数字列表。
$itemClause = count($listingIds) > 0 ? ' AND A.ItemID IN ('.implode(',', $listingIds).')' : '';
关于mysql - SQL - 即使 LEFT JOIN 失败也返回行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50331876/