【问题标题】:Nested Select with JOIN, Returns NULL if no match?使用 JOIN 嵌套选择,如果不匹配则返回 NULL?
【发布时间】:2014-04-22 22:10:37
【问题描述】:

我遇到了 MySQL 连接问题,连接条件有时在第一个嵌套的 Select 查询中不满足,这会导致该查询的完全 NULL 结果。

有人能告诉我到底发生了什么吗?无论在第一个嵌套选择查询中是否满足 join 语句的条件,我都打算从查询中获取一个值。

SELECT 
(
    SELECT SUM(amount) 
    FROM 
        package_orders
        JOIN packages_products 
        ON package_orders.package_id = package_orders.package_id
    WHERE 
        quote_id =1
    AND rev =1
)
+
(
    SELECT SUM(amount) 
    FROM
        orders
    WHERE 
        quote_id =1
    AND rev =1
) 
AS quote_total

谢谢!

【问题讨论】:

  • 你试过left join吗?
  • 不幸的是,左连接返回 NULL 值

标签: mysql join


【解决方案1】:

我发现了两个潜在的问题。

如果您的问题只是从 packages_products 上的 package_orders 加入返回 null,那么您是否可能在寻找外部联接?即使没有匹配的 package_products,外连接也会返回 package_orders。

SELECT (
SELECT SUM(amount) 
FROM package_orders
LEFT JOIN packages_products ON package_orders.package_id = package_orders.package_id
WHERE quote_id =1
AND rev =1
...

或者是你的第二个值查询的问题

...
SELECT SUM(amount) 
FROM orders
WHERE quote_id =1
AND rev =1
...

导致整个事情为空?这是因为数字 + null = null。因此,如果第二个查询可能返回 null,则您需要处理这种情况并返回零。

...
IFNULL((SELECT SUM(amount) 
FROM orders
WHERE quote_id =1
AND rev =1), 0)
...

希望对你有帮助

【讨论】:

  • 嘿,非常感谢!今天才知道NULL+1 = NULL。是的,已经修复了第一个 SELECT 查询,当没有订单时,第二个成为问题 - 即使有包裹也会导致 NULL 值!再次感谢!
【解决方案2】:

NULL+1 仍然是NULL,所以你必须像这样用IFNULL(expr1, 0) 包裹第一个SELECT

SELECT IFNULL((
SELECT SUM(amount) 
FROM package_orders
JOIN packages_products ON package_orders.package_id = package_orders.package_id
WHERE quote_id =1
AND rev =1
),0)

+

(
SELECT SUM(amount) 
FROM orders
WHERE quote_id =1
AND rev =1
) 

AS quote_total

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-17
    相关资源
    最近更新 更多