对于单个表,MYSQL计数唯一行,即使计数为零
我有一张和这把小提琴一样的桌子- 我尝试计算访问的唯一次数,但我还需要有计数为零的日期。在样本结果中,您可以看到,对于2019-07-24年的日期,.bid和25日的类似结果缺失0 我通过stackoverflow进行了搜索,只找到了使用左联接的多个表的解决方案。我不知道如何将其应用于单个表 下面是我的工作查询,它不显示零值对于单个表,MYSQL计数唯一行,即使计数为零,mysql,Mysql,我有一张和这把小提琴一样的桌子- 我尝试计算访问的唯一次数,但我还需要有计数为零的日期。在样本结果中,您可以看到,对于2019-07-24年的日期,.bid和25日的类似结果缺失0 我通过stackoverflow进行了搜索,只找到了使用左联接的多个表的解决方案。我不知道如何将其应用于单个表 下面是我的工作查询,它不显示零值 SELECT COUNT(DISTINCT `hash`) wizyt, DATE(timestamp) AS timestamp, CASE
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'FROMtracking\u actions
cross-join(在第4行选择distinct case',给出错误:(MySQL服务器版本用于正确语法使用near'FROMtracking\u actions
cross-join(在第行选择不同的大小写。)4@toHo-我在MariaDB中找到了文档并更新了答案。@toHo-我在MariaDB中找到了文档并更新了答案。