2011-03-29 4 views
1
SELECT 
    cms_module_ladu_batch.id AS batch_id, 
    name, t1, cms_module_ladu_batch.date_changed AS date_ch, 
    t13, t2, t3, t4, bkuup, date_modified, date_created, 
    kogused.aadress AS aadress, 
    kogused.kogus AS kogus, 
    SUM(kogused.kogus) AS total 
FROM 
    cms_module_ladu_batch 
    LEFT JOIN kogused 
    ON cms_module_ladu_batch.id = kogused.bid 
WHERE 
    t2!='Sildid' 
GROUP BY 
    batch_id 

C'est le code MySQL - le problème est le suivant. J'ai besoin d'exclure les lignes où total est 0 et date_ch plus d'un mois (le format date_cd est "2011-01-01 00:00:00"). est-ce possible? http://jsfiddle.net/tiitremmel/2mvrr/1/ - Échantillon jsfiddle - la première table est comme le résultat de mysql est le défaut et la deuxième table est comment le résultat devrait ressembler.MySQL Comment inclure dans où deux clause?

Répondre

0
SELECT cms_module_ladu_batch.id AS batch_id, 
      cms_module_ladu_batch.date_changed AS date_ch, 
      kogused.kogus AS kogus, 
      SUM(kogused.kogus) AS total 
FROM  cms_module_ladu_batch 
LEFT JOIN kogused ON cms_module_ladu_batch.id = kogused.bid 
WHERE  t2 != 'Sildid' 
GROUP BY batch_id 
HAVING (
     (
      cms_module_ladu_batch.date_changed < DATE_SUB(NOW(), INTERVAL 1 MONTH) 
      AND SUM(kogused.kogus) > 0 
     ) 
    OR 
      cms_module_ladu_batch.date_changed > DATE_SUB(NOW(), INTERVAL 1 MONTH) 
      ); 

Ce sont le code final qui a fonctionné pour moi. Un grand merci à tous, mais le meilleur à Bjoern - votre idée du code m'a beaucoup aidé!

2

Ajouter la condition de date dans la WHERE -Déclaration et l'exclusion de votre SUM comme HAVING -Déclaration. Il devrait alors ressembler à ceci:

SELECT cms_module_ladu_batch.id AS batch_id, 
      cms_module_ladu_batch.date_changed AS date_ch, 
      kogused.kogus AS kogus, 
      SUM(kogused.kogus) AS total 
FROM  cms_module_ladu_batch 
LEFT JOIN kogused ON cms_module_ladu_batch.id = kogused.bid 
WHERE  t2 != 'Sildid' 
      AND (
        (
        cms_module_ladu_batch.date_changed < DATE_SUB(NOW(), INTERVAL 1 MONTH) 
        AND SUM(kogused.kogus) > 0 
       ) 
       OR 
        cms_module_ladu_batch.date_changed > DATE_SUB(NOW(), INTERVAL 1 MONTH) 
      ) 
GROUP BY batch_id; 

Alternativement ... utilisez une instruction UNION pour coller deux SELECTS ensemble.

SELECT cms_module_ladu_batch.id AS batch_id, 
     cms_module_ladu_batch.date_changed AS date_ch, 
     kogused.kogus AS kogus, 
     SUM(kogused.kogus) AS total 
FROM  cms_module_ladu_batch 
LEFT JOIN kogused ON cms_module_ladu_batch.id = kogused.bid 
WHERE t2 != 'Sildid' 
     AND cms_module_ladu_batch.date_changed < DATE_SUB(NOW(), INTERVAL 1 MONTH) 
GROUP BY batch_id 
HAVING total > 0 
UNION 
SELECT cms_module_ladu_batch.id AS batch_id, 
     cms_module_ladu_batch.date_changed AS date_ch, 
     kogused.kogus AS kogus, 
     SUM(kogused.kogus) AS total 
FROM  cms_module_ladu_batch 
LEFT JOIN kogused ON cms_module_ladu_batch.id = kogused.bid 
WHERE t2 != 'Sildid' 
     AND cms_module_ladu_batch.date_changed > DATE_SUB(NOW(), INTERVAL 1 MONTH) 
GROUP BY batch_id; 

Essayez les deux, voyez ce qui convient le mieux à votre solution.

+0

les alias ne fonctionnent pas là où –

+0

très vrai - je viens de corriger cela! – Bjoern

+0

mais toujours les deux clauses font leur travail mais le résultat n'est pas ce dont j'ai besoin. date partie exclut toutes les autres dates, mais je dois exclure seulement les dates que le total de la ligne est 0. merci quand même :) –

1
SELECT 
    cms_module_ladu_batch.id AS batch_id, 
    name, t1, cms_module_ladu_batch.date_changed AS date_ch, 
    t13, t2, t3, t4, bkuup, date_modified, date_created, 
    kogused.aadress AS aadress, 
    kogused.kogus AS kogus, 
    SUM(kogused.kogus) AS total 
FROM 
    cms_module_ladu_batch 
    LEFT JOIN kogused 
    ON cms_module_ladu_batch.id = kogused.bid 
WHERE 
    t2!='Sildid' AND 
    date_ch < date_sub(now(), interval 1 month) 
GROUP BY 
    batch_id 
HAVING 
    SUM(kogused.kogus) <> 0 
0

il suffit d'ajouter au bas:

HAVING (total<>0) AND (date_cd>=ADDDATE(CURDATE(), INTERVAL -1 MONTH)) 

Autre réponse (voir les commentaires):

HAVING (total<>0) OR (date_cd>=ADDDATE(CURDATE(), INTERVAL -1 MONTH)) 
+0

cela semble être le plus proche, mais il supprime tous les zéros - c'est le problème. J'ai besoin d'enlever les zéros de plus d'un mois. –

+0

vous avez écrit "J'ai besoin d'exclure les lignes où total est 0 et date_ch plus d'un mois".Il peut être à la fois "Je dois exclure les lignes où (total vaut 0) et (date_ch plus d'un mois)" ou "Je dois exclure les lignes où (total est 0 et date_ch plus d'un mois)". – Skrol29

+0

donc j'ai terminé la réponse – Skrol29