对于单个表,MYSQL计数唯一行,即使计数为零

对于单个表,MYSQL计数唯一行,即使计数为零,mysql,Mysql,我有一张和这把小提琴一样的桌子- 我尝试计算访问的唯一次数,但我还需要有计数为零的日期。在样本结果中,您可以看到,对于2019-07-24年的日期,.bid和25日的类似结果缺失0 我通过stackoverflow进行了搜索,只找到了使用左联接的多个表的解决方案。我不知道如何将其应用于单个表 下面是我的工作查询,它不显示零值 SELECT COUNT(DISTINCT `hash`) wizyt, DATE(timestamp) AS timestamp, CASE

我有一张和这把小提琴一样的桌子-

我尝试计算访问的唯一次数,但我还需要有计数为零的日期。在样本结果中,您可以看到,对于2019-07-24年的日期,.bid和25日的类似结果缺失0

我通过stackoverflow进行了搜索,只找到了使用左联接的多个表的解决方案。我不知道如何将其应用于单个表

下面是我的工作查询,它不显示零值

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

请提供帮助:)

您应该首先使用交叉连接来生成所需行的键(日期和landi),并在相关计数中使用左连接oba

select a.my_date, a.landing , ifnull(t.wizyt,0) wizyt
from (
    SELECT distinct  DATE(timestamp) my_date
    from  FROM `tracking_actions` 
    cross  join  (
        select  distinct case 
            WHEN url LIKE '%.bid%' THEN 'bid'
            WHEN url LIKE '%.online%' THEN 'online' 
            end landing
        from 
        FROM `tracking_actions`
        WHERE `action` = 'w90|landing-visit'
    ) 
    WHERE `action` = 'w90|landing-visit' 
) a 

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

) t  ON t.landing = a.landing and a.my_date  = t.timestamp

您应该首先使用交叉连接为您需要的行生成键(date和landi),并在related计数中使用left join oba

select a.my_date, a.landing , ifnull(t.wizyt,0) wizyt
from (
    SELECT distinct  DATE(timestamp) my_date
    from  FROM `tracking_actions` 
    cross  join  (
        select  distinct case 
            WHEN url LIKE '%.bid%' THEN 'bid'
            WHEN url LIKE '%.online%' THEN 'online' 
            end landing
        from 
        FROM `tracking_actions`
        WHERE `action` = 'w90|landing-visit'
    ) 
    WHERE `action` = 'w90|landing-visit' 
) a 

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

) t  ON t.landing = a.landing and a.my_date  = t.timestamp

问题是,在SQL中,通常不能从无到有地创建行。如果您有一组行,则可以通过各种方式将其减少(如
分组方式
其中
拥有
),或者可以将其与另一组行相乘(使用各种
连接
)。但是你不能凭空创建行,这就是你要做的。如果有一个没有活动的日期,那么您将没有该日期的任何行,也无法获得包含该日期的行

因此,从概念上讲,有两种方法可以解决这个问题。更通用的方法是创建一个包含所有日期的日历表。或者可能有三个表,分别是
,您可以
将这三个表合并起来以获得实际日期(尽管这有点棘手)。然后,当每个日期都有一行时,您可以将实际数据与之关联,得到零

或者,您需要查看特定于数据库的SQL扩展

MariaDB有一些常用的表表达式可以实现这一点(请参阅此相关问题以获得启发:)

它还有一个“”用于创建带有数字序列的伪表。这些可以转换为日期

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


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

问题是-在SQL中,您通常无法无中生有地创建行。如果您有一组行,则可以通过各种方式将其减少(如
分组方式
其中
拥有
),或者可以将其与另一组行相乘(使用各种
连接
)。但是你不能凭空创建行,这就是你要做的。如果有一个没有活动的日期,那么您将没有该日期的任何行,也无法获得包含该日期的行

因此,从概念上讲,有两种方法可以解决这个问题。更通用的方法是创建一个包含所有日期的日历表。或者可能有三个表,分别是
,您可以
将这三个表合并起来以获得实际日期(尽管这有点棘手)。然后,当每个日期都有一行时,您可以将实际数据与之关联,得到零

或者,您需要查看特定于数据库的SQL扩展

MariaDB有一些常用的表表达式可以实现这一点(请参阅此相关问题以获得启发:)

它还有一个“”用于创建带有数字序列的伪表。这些可以转换为日期

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


最后但并非最不重要的一点是,还可以选择不为此使用SQL。在获得不完整的数据集后,用您选择的编程语言(您可能正在这样做)处理它并填补空白。

如果我们给您这个,您能找出其余的:
从跟踪动作x,跟踪动作y中选择不同的日期(x.timestamp)dt,y.url
(在最终解决方案中不需要使用DISTINCT)如果我们给你这个,你能计算出剩下的:
从跟踪动作x中选择DISTINCT DATE(x.timestamp)dt,y.url,跟踪动作y
(在最终解决方案中不需要DISTINCT)它给出了错误:(MySQL服务器版本用于正确语法使用near'FROM
tracking\u actions
cross-join(在第4行选择distinct case',给出错误:(MySQL服务器版本用于正确语法使用near'FROM
tracking\u actions
cross-join(在第行选择不同的大小写。)4@toHo-我在MariaDB中找到了文档并更新了答案。@toHo-我在MariaDB中找到了文档并更新了答案。