【问题标题】:How to always return subquery result?如何始终返回子查询结果?
【发布时间】:2012-12-30 07:41:18
【问题描述】:

我知道这个问题被问了很多,但不知道我是否应该使用 COALESCE ifnull 或其他东西。

我有以下疑问:

 select (amount-
(select (sum(l.amount_sum)-sum(lr.reward)) as total
from logs l
join logs_rewards lr on l.id = lr.related_log_id
where l.agent_id = '1'))
as balance
from logs_payments
where agent_id = '1'

现在的问题是如果agent_idlogs_payments 中不存在,则查询将不会返回行,但我希望它做的就是返回结果,但如果amounts 不存在,请设置子查询为 0

现在我考虑查询不同的表并像这样加入结果:

select (lp.amount-
(select (sum(l.amount_sum)-sum(lr.reward)) as total
from logs l
join logs_rewards lr on l.id = lr.related_log_id
where l.agent_id = '1'))
as balance
from agents a
join logs_payments lp on lp.agent_id = a.id
where a.id = '1'

但这也没有用。我应该采取什么方法来解决这个问题?

为了清楚起见,我希望此查询始终返回子查询的金额结果,如果不存在金额仍然返回结果但计算为 0。

【问题讨论】:

    标签: mysql sql select join


    【解决方案1】:

    好吧,我使用以下代码使用 JW 关于 LEFT JOIN 的评论和 Saharsh 关于 ifnull 的评论让它工作:

    select ifnull(sum(lp.amount),0)-
    (select (sum(l.amount_sum)-sum(lr.reward)) as total
    from logs l
    join logs_rewards lr on l.id = lr.related_log_id
    where l.agent_id = '1')
    as balance
    from agents a
    left join logs_payments lp on lp.agent_id = a.id
    where a.id = '1'
    

    感谢两位的帮助!

    【讨论】:

    • 我会的,但你的回答和 JW 的回答一样有帮助,它为我指明了正确的方向。你的代码不起作用(即使我修复了你那里的语法错误)所以我没有接受它并将接受我自己的,对不起,再次感谢你的帮助!
    【解决方案2】:

    使用LEFT JOIN

    SELECT  a.amount - COALESCE(b.total, 0) as balance
    FROM    logs_payments a
            LEFT JOIN
            (
                SELECT  agent_id, sum(l.amount_sum) - sum(lr.reward) as total
                FROM    logs l
                        INNER JOIN logs_rewards lr 
                            ON  l.id = lr.related_log_id
                GROUP BY agent_id
            ) b ON a.agent_id = b.agent_id
    WHERE   a.agent_id = 1
    

    【讨论】:

    • 这仍然没有返回任何内容,因为 logs_payments 不包含所需 agent_id 的任何记录
    • 所以你的意思是你正在搜索特定的agent_id 但是如果那个id没有记录,你想显示零而不是什么都没有。对吗?
    • 是的,但我让它工作了,我忘记了左连接。非常感谢 JW!
    【解决方案3】:

    试试这个:

    SELECT l.agent_id, IFNULL(lp.amount, 0) amt, l.total 
    FROM (SELECT l.agent_id, (SUM(l.amount_sum) - SUM(lr.reward)) AS total 
          FROM logs l INNER JOIN logs_rewards lr ON l.id = lr.related_log_id 
          WHERE l.agent_id = '1') AS l 
    LEFT jon log_payments lp ON l.agent_id =lp.agent_id 
    WHERE l.agent_id = '1' 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 2015-01-08
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多