2015-07-21 1 views
0

J'ai cette requête qui affiche le nombre de lignes pour chaque jour et s'il n'y a pas de lignes, il affiche 0.MySQL - Comptez toutes les lignes pour chaque jour de la semaine, mais pour chaque expéditeur

J'ai maintenant une somme supplémentaire champ que je veux ajouter dans la requête appelée «expéditeur». J'ai besoin de la requête pour faire exactement la même chose, mais pour chacun des expéditeurs.

Comment puis-je effectuer une requête afin que chaque expéditeur obtienne chaque jour de la semaine avec les valeurs?

SELECT DAYNAME(DATE_SUB(CURDATE(), INTERVAL Days.n DAY)) AS `day`, 
     COUNT(r.List_Date) AS `total` 
FROM (SELECT 1 as n UNION ALL SELECT 2 as n UNION ALL 
     SELECT 3 as n UNION ALL SELECT 4 as n UNION ALL 
     SELECT 5 as n UNION ALL SELECT 6 as n UNION ALL 
     SELECT 7 as n 
    ) Days LEFT JOIN 
    returns r 
    ON r.List_Date >= DATE_SUB(CURDATE(), INTERVAL Days.n DAY) 
GROUP BY Days.n 
ORDER BY Days.n DESC 
+1

'groupe par expéditeur, jours.n' –

+0

J'ai essayé mais cela n'a pas fonctionné – AdRock

Répondre

1

Vous avez besoin d'un cross join pour obtenir toutes les lignes (chaque expéditeur et chaque jour de la semaine). Utilisez ensuite le left join:

SELECT s.sender, DAYNAME(DATE_SUB(CURDATE(), INTERVAL Days.n DAY)) AS `day`, 
     COUNT(r.List_Date) AS `total` 
FROM (SELECT 1 as n UNION ALL SELECT 2 as n UNION ALL 
     SELECT 3 as n UNION ALL SELECT 4 as n UNION ALL 
     SELECT 5 as n UNION ALL SELECT 6 as n UNION ALL 
     SELECT 7 as n 
    ) Days CROSS JOIN 
    (SELECT DISTINCT sender FROM returns) s LEFT JOIN 
    returns r 
    ON r.List_Date >= DATE_SUB(CURDATE(), INTERVAL Days.n DAY) and 
     r.sender = s.sender 
GROUP BY s.sender, Days.n 
ORDER BY s.sender, Days.n DESC; 

Il utilise la table returns pour obtenir les expéditeurs appropriés. Si vous avez une autre table, vous pouvez l'utiliser à la place.

+0

Merci @Gordon Linoff ,. Fait exactement ce que je veux – AdRock