2012-04-28 5 views
0

Si la table makale_payments est nulle, la requête renvoie null. Comment dois-je définir la requête pour obtenir des recors si elle n'existe pas dans SUM (payment_total) comme 0.00?requête de jointure mysql avec somme 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 

Répondre

0

MySQL ne retourne pas les valeurs globales pour les lignes qui reviennent nulls, même si le test spécifiquement pour ISNULL. ISNULL est seulement pour vérifier si une colonne est nulle, pas si la relation renvoie null. J'ai cependant trouvé une manière (bien que très obscure) de contourner cette limitation. La prémisse de base est d'unir toutes les deux instructions sql et d'utiliser la requête à deux unions comme sous-requête à sélectionner.

Les queryies seraient filles fusionnées sous la forme:

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 

Avec la requête ci-dessus, vous obtiendrez deux lignes pour chaque ligne que la relation est non nul, et une ligne quand il est. Si vous additionnez ces lignes et groupez par, alors vous devriez vous retrouver avec les valeurs que vous voulez. Donc, vous créez ensuite une requête qui utilise ce qui précède que la table pour sélectionner et résume la colonne globale:

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 

Je suis probablement hors de la syntaxe de la requête, désolé, je n'ai pas MySQL ici pour tester.

1

C'est ce que IFNULL est pour:

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

Renvoie zéro à nouveau ... –

0

Une simple où aurait pas de mal je suppose

WHERE SUM(`article_payment`) > 0 
+0

# 1064 - Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de 'WHERE SUM ('article_payment')> 0 LIMIT 0, 30' à la ligne 5 –

+0

essayez ceci' WHERE SUM (t1.article_payment)> 0' – Starx

+0

nope ... renvoie null –

1

article_payment est probablement NULL pour une ligne. Essayez ceci:

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

requête renvoie à nouveau null .. –

+1

@ dr.linux - J'ai vu votre sqlfiddle, ma requête semble fonctionner (après la mise à jour des noms de table avec 'makale_'): http://sqlfiddle.com/#!2/2cd06/12 – bfavaretto

+0

article_payments n'est pas nul s'il vous plaît effacer les données dans le table et essayez la requête. –