mysql - SQL - 即使 LEFT JOIN 失败也返回行

标签 mysql sql

我有一个带有一些连接的查询,这些连接从多个表返回数据

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/

相关文章:

php - 在mysql字段中插入≠(不等于)

mysql - sql left join : always return left table columns, 无论条件如何

mysql - sql中没有数据的地方如何显示零

sql - 如何在查询结果中找到项目索引号

mysql - 当名称已经明确时,是否有必要为 Country 表使用整数 ID?

mysql - sql COUNT 出现问题

MySQL 计算月份之间的差异

c# - 当我的返回值不为空时,为什么 ExecuteScalar() 返回空值?

sql - Postgres 9.4 的中位数 - 为什么我的代码不工作?

mysql - MySQL 中具有 TEXT 数据类型的表未复制到 Oracle