【问题标题】:MySQL gett rows from last week with their day nameMySQL 从上周获取行及其日期名称
【发布时间】:2015-07-20 11:16:05
【问题描述】:

我在查询时遇到问题。这取自一个类似的查询,我计算每月的行数。

我想统计上周每一天的所有行并显示日期名称和计数。如果当天没有行,则显示为零。

我知道 UNIONS 不起作用,但我不知道用什么替换它。

目前获取最后 7 天,但日期名称为 NULL

SELECT  DAYNAME(STR_TO_DATE(Days.ID, '%a')) AS `day`, COUNT(`returns`.list_date) AS `total`
FROM 
(
  SELECT 1 as ID UNION SELECT 2 as ID UNION  SELECT 3 as ID UNION SELECT 4 as ID 
  UNION  
  SELECT 5 as ID UNION SELECT 6 as ID UNION SELECT 7 as ID
) as Days

    WHERE (list_date  >= DATE_SUB(NOW(), INTERVAL 1 WEEK))
GROUP BY Days.id

更新:

我创建了一个 SQL 小提琴,显示下面 @Gordon Linoff 答案的代码输出,它没有得到计数的行

http://sqlfiddle.com/#!9/969463/1

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    做你想做的事的一种方法是LEFT JOIN

    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;
    

    一些注意事项:

    • 使用UNION ALL 而不是UNION,除非您有充分的理由承担删除重复项的开销。
    • 这假定returns.list_date 实际上是一个日期,因为它使用= 而不是>=
    • now()>= 的使用有点混乱,因为now() 有一个时间组件,您通常想忽略它。

    【讨论】:

    • 刚试过这个,我整天都得零。我什至只是在 3 天前添加了一行,但它没有捡起它。有什么想法吗?
    • 如果我不得不猜测,你的list_date 有一个时间组件。
    • 只需阅读您关于 list_date 是日期的说明,我使用 >= 并且它有效
    • 如何更新查询以获取特定发件人的所有行(称为发件人的列)
    猜你喜欢
    • 2014-01-21
    • 1970-01-01
    • 2015-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-16
    • 2014-08-10
    • 1970-01-01
    相关资源
    最近更新 更多