【问题标题】:0 When no row exist0 当不存在行时
【发布时间】:2016-09-09 13:05:20
【问题描述】:

我有以下 sql 查询

 SELECT DATE_FORMAT(date,'%d.%m. %y') as date, COUNT(idStat) as number
  FROM stat 
  WHERE IdGame = ? AND date >= ? AND date <= ? 
  GROUP BY date

它返回日期和今天有多少人访问游戏,但是当今天没有行时如何返回0?

例如 15.12.1993 日在 db 中不存在,但用户选择的日期在 15.10.1950 和 12.15.2020 之间。

我想返回这个不存在的日期 15.12.1993 但计数为 0。 这甚至可能吗?

感谢您的帮助,

菲利普。

【问题讨论】:

  • 您必须针对包含所有日期的表格发送left join。但是你应该在你的程序逻辑中而不是在 SQL 中处理它
  • 或者,如果您没有包含所有日期的表,您可以使用递归查询生成它们。
  • 但是日期在同一个表中...在表中是日期列、城市列、IP地址列...
  • 看看stackoverflow.com/questions/2157282/… LEFT JOIN会有所帮助。

标签: php mysql sql date


【解决方案1】:

最好的方法是准备一张带有相关日期的Calendar 表。然后您可以使用left join 来获取日期。像这样的:

SELECT DATE_FORMAT(c.date,'%d.%m. %y') as date, COUNT(s.idStat) as number
FROM Calendar c LEFT JOIN
     stat s
     ON c.date = s.date AND s.IdGame = ?
WHERE c.date >= ? AND c.date <= ?
GROUP BY c.date;

如果您在每个日期都有游戏,但问题是特定的游戏不是一天一个,您可以使用以下快捷方式:

SELECT DATE_FORMAT(date,'%d.%m. %y') as date, SUM(IdGame = ?) as number
FROM stat
WHERE date >= ? AND date <= ?
GROUP BY date;

这并不适用于所有情况,但它可能是一个有用的捷径。

【讨论】:

  • 我无法添加日历表:/ 我只能使用现有表。如果我的游戏在特定日期没有访问,例如 15.12.1993,则没有行。
【解决方案2】:

我使用 RedFilter Answer 来解决我的问题,来自这个链接:generate days from date range

我的查询现在看起来像这样:

select DATE_FORMAT(a.Date,'%d.%m. %Y'), COUNT(stat.IdStat)
from (
    select curdate() - INTERVAL (a.a + (10 * b.a) + (100 * c.a)) DAY as Date
    from (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as a
    cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as b
    cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as c
) as a LEFT JOIN stat ON a.Date = stat.date
where a.Date between ? and ? AND (stat.IdGame = ? OR stat.IdGame IS NULL) GROUP BY a.Date

但是我需要从我的数据选择器中删除未来的日期,因为当我在这个 sql 中使用未来日期时,不会返回任何数据...我需要设置我的数据选择器的最小值和最大值。

【讨论】:

    猜你喜欢
    • 2016-05-02
    • 1970-01-01
    • 2019-06-14
    • 2018-10-29
    • 2023-04-03
    • 1970-01-01
    • 2021-11-13
    • 2015-10-15
    • 1970-01-01
    相关资源
    最近更新 更多