MySQL - 计算一周中每一天的所有行,但针对每个发件人
MySQL - Count all rows for each day of week but for each sender
我有这个查询,它输出每天的行数,如果没有行,它输出 0。
我现在有一个额外的字段要添加到名为 'Sender' 的查询中。我需要查询为每个发件人执行完全相同的操作。
如何执行查询以便每个发件人都获得一周中的每一天的值?
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
您需要 cross join
来获取所有行(每个发件人和一周中的每一天)。然后使用 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;
这使用 returns
table 来获取适当的发件人。如果您有另一个 table,您可以使用它。
我有这个查询,它输出每天的行数,如果没有行,它输出 0。
我现在有一个额外的字段要添加到名为 'Sender' 的查询中。我需要查询为每个发件人执行完全相同的操作。
如何执行查询以便每个发件人都获得一周中的每一天的值?
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
您需要 cross join
来获取所有行(每个发件人和一周中的每一天)。然后使用 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;
这使用 returns
table 来获取适当的发件人。如果您有另一个 table,您可以使用它。