2011-05-13 7 views
1

Lorsque je cours une requête suivante, elle affiche seulement 1 ligne. Basé sur la condition "created_date", où, comme si je supprimais la condition "created_date" et que je gardais juste la condition "status_change_date", il affiche 3 lignes.Requête SQL donnant un mauvais résultat

Je veux voir tous les éléments qui ont été créés ou modifiés dans le temps imparti. Je suis incapable de trouver ce qui est erroné dans la requête

`SELECT DISTINCT products.id AS product, status.id AS stat, COUNT(*) AS total FROM items 
     INNER JOIN products ON (items.fk_product_id = products.id) 
     INNER JOIN status ON (items.fk_status = status.id) 
     WHERE DATE(items.status_change_date) BETWEEN '2011-04-13' AND '2011-05-13' 
     OR DATE(items.created_date) BETWEEN '2011-04-13' AND '2011-05-13' 
     AND status.id = 2 
     GROUP BY products.name, status.name order by products.name`

Répondre

1

Votre clause WHERE semble erroné, essayez:

WHERE 
    (DATE(items.status_change_date) BETWEEN '2011-04-13' AND '2011-05-13' 
    OR DATE(items.created_date) BETWEEN '2011-04-13' AND '2011-05-13') 
     AND status.id = 2 
     GROUP BY products.name, status.name order by products.name 
+0

Lorsque j'ôterai status.id = 2 pour voir tous les statuts montre 1 row pour status.id = 2 dans le résultat ensemble – Johal

+0

i enlevé DISTINCT reste le même – Johal

+0

@Johal Avez-vous essayé de mettre des parens autour de votre clause where? Il y a peut-être d'autres problèmes avec votre requête, mais vous avez fait x OR y ET z au lieu de (x ou y) et z. La façon dont vous l'aviez écrite ne renvoyait des enregistrements que si change_date se trouvait dans la plage de dates OU si la date de création était comprise dans la plage de dates et l'ID d'état était 2. Je pense que vous souhaitez renvoyer les enregistrements. sont dans la plage de dates et l'ID d'état est 2. – rsbarro

1

supports Mettez autour de vos clauses de date:

WHERE (DATE(items.status_change_date) BETWEEN '2011-04-13' AND '2011-05-13' 
    OR DATE(items.created_date) BETWEEN '2011-04-13' AND '2011-05-13') 
    AND status.id = 2 
1

Je sens les conditions sont en cours evalulated comme celui-ci

status_change_date or (created_date and status.id = 2) 

Vous peut-être essayer d'utiliser des parenthèses pour désigner le regroupement de vos conditions

(DATE(items.status_change_date)... OR DATE(items.created_date)...) 
    AND status.id = 2 
Questions connexes