2012-04-28 24 views
0

makale_paymentsテーブルがnullの場合、クエリはnullを返します。 0.00のようにSUM(payment_total)にdoesntが存在する場合、私はどのようにクエリを設定しますか?mysql join query with sum retuns null

SELECT article_name,user_real_name,user_name,SUM(`article_payment`) as holding,paid 
FROM makale_articles AS t1 
JOIN makale_users ON (t1.article_name=makale_users.user_id) 
JOIN (SELECT user_id,SUM(`payment_total`) as paid FROM makale_payments GROUP BY user_id) AS t2 ON (t1.article_name=t2.user_id) 
GROUP BY t2.user_id 

答えて

0

MySQLは、具体的ISNULLをテストしても、NULLを返す行の集計値を返しません。 ISNULLは、列がNULLかどうかをチェックするためのもので、リレーションがnullを返すものではありません。しかし、私はこの制限を回避する(非常に曖昧ではありますが)方法を見つけました。基本的な前提は、2つのSQL文をすべて結合し、2つの結合されていない問合せをサブクエリとして使用して選択することです。

UNION句queryiesは次の形式になります。

select column1, column2, SUM(column3) as payment from tablea, tableb where.... 
    union all 
    select column1, column2, 0.00 as payment from tablea --notice no join, and a specified value and alias for aggregate column 

上記のクエリで、それがあるとき、あなたは関係がnullでないことをすべての行には2つの行、1行を取得します。行とグループを合計すると、目的の値が得られるはずです。私はおそらくオフクエリの構文の午前、申し訳ありませんが、私はここにMySQLを持っていない

select column1, column2, SUM(payment) from 

    (select column1, column2, SUM(column3) as payment from tablea, tableb where.... 
    union all 
    select column1, column2, 0.00 as payment from tablea) as b 
    group by column1, column2 

:だから、その後、から選択するためのテーブルとして上記を使用し、集計列を合計するクエリを作成しますテスト。

1

これはIFNULLが何のためにあるのかです:

IFNULL(SUM(...), 0.0) 
+0

が再びnullを返します。 –

0

私は

WHERE SUM(`article_payment`) > 0 
+0

#1064 - SQL構文にエラーがあります。あなたのMySQLサーバーのバージョンに対応するマニュアルをチェックして、正しい構文がWHERE SUM( 'article_payment')> 0 LIMIT 0、30 'の行5 –

+0

の近くで使用するようにしてくださいこの' WHERE SUM(t1.article_payment)> 0' – Starx

+0

nope ... returns null –

1

article_paymentは、おそらくいくつかの行のNULLだと思い傷つけていませんWHEREシンプル。これを試してみてください:

SELECT 
    article_name, 
    user_real_name, 
    user_name, 
    SUM(COALESCE(`article_payment`, 0)) as holding, 
    paid 
FROM article_articles AS t1 
JOIN article_users ON (t1.article_name=article_users.user_id) 
JOIN (
    SELECT user_id, SUM(COALESCE(`payment_total`, 0)) as paid 
    FROM article_payments 
    GROUP BY user_id 
) AS t2 ON (t1.article_name=t2.user_id) 
GROUP BY t2.user_id 
+0

クエリは再びnullを返します.. –

+1

@ dr.linux - あなたのsqlfiddleを見ましたが、私のクエリは動作しているようです(テーブル名を 'makale_'で更新した後):http://sqlfiddle.com/#!2/2cd06/12 – bfavaretto

+0

article_paymentsはnullではありません。テーブルを開き、クエリを試してください。 –