2

私はこの質問がたくさん聞かれたことを知っていますが、私が使うべき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_id存在しない場合はlogs_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として計算します。

4

3 に答える 3

1

ifnullさて、LEFT JOINに関するJWのコメントと、次のコードの使用に関するSaharshの発言を使用して動作するようになりました。

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'

お二方、ご協力ありがとうございました!

于 2012-12-30T07:51:34.890 に答える
0

使用する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
于 2012-12-30T07:44:58.807 に答える
0

これを試して :

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' 
于 2012-12-30T07:47:31.527 に答える