首页 > 解决方案 > MYSQL 计数唯一行,即使计数为零,对于单个表

问题描述

我有一个像这个 SQLfiddle 一样的表 - http://www.sqlfiddle.com/#!9/3b6f8a/1

我尝试计算访问的唯一次数,但我还需要计数为零的日期。在示例结果中,您可以看到日期为 2019-07-24 的 .bid 缺少 0 结果,而 25 日的结果类似。

我搜索了stackoverflow,只找到了使用LEFT JOIN 的多个表的解决方案。我不知道如何将它应用于单个表。

下面是我没有显示零值的工作查询。

SELECT COUNT(DISTINCT `hash`) wizyt, DATE(timestamp) AS timestamp, CASE
                    WHEN url LIKE '%.bid%' THEN 'bid'
                    WHEN url LIKE '%.online%' THEN 'online'
                END AS landing
            FROM `tracking_actions`
            WHERE `action` = 'w90|landing-visit'
            GROUP BY DATE(timestamp), landing  ORDER BY timestamp

请帮助:)

标签: mysql

解决方案


问题是 - 在 SQL 中,您通常不能无中生有地创建行。如果您有一组行,那么您可以通过各种方式(如group byorwherehaving)减少它,或者您可以将它与另一组行相乘(使用各种join)。但是您不能凭空创建行,而这正是您想要做的。如果某个日期没有活动,那么您将没有任何行,也无法获得该日期的行。

因此,从概念上讲,有两种方法可以尝试解决这个问题。更通用的是创建一个包含所有日期的日历表。或者可能是三个表years,你可以months一起获得实际日期(尽管这有点棘手)。然后,当每个日期都有一行时,您可以将实际数据加入到行中,您将得到零。daysjoin

或者,您需要查看特定于 DB 的 SQL 扩展。

MariaDB 有可以执行此操作的通用表表达式(请参阅此相关问题以获取灵感:How do I make a row generator in MySQL?

它还有一个“序列存储引擎”,可以创建带有数字序列的伪表。这些可以转换为日期。

对于 MySQL 本身,我不知道可以使用什么。仔细阅读文档,也许您会发现一些可以生成行并可以对其进行调整的内容。

最后但同样重要的是,还可以选择不为此使用 SQL。在获得不完整的数据集后,用您选择的编程语言(无论如何您可能正在这样做)对其进行处理并填补空白。


推荐阅读