MySQL对两个表进行联合,其中一个带有时间戳,另一个带有日期

鲜雪

我正在尝试针对一个广告的效果汇总一份报告,以显示该广告在一天中的观看次数和点击次数。视图和单击存储在具有不同结构的单独表中,因此我认为我必须执行合并。

我已经阅读并理解了这篇奇妙的文章它帮助了我,但我认为这比那里解释的示例复杂了一个层次。希望得到社区的帮助。

这是我的views表格,其中存储了广告在一天中获得的观看次数的计数器。

+-------------+--------------+
| COLUMN_NAME | COLUMN_TYPE  |
+-------------+--------------+
| ad_day_id   | bigint(13)   |
| advert_id   | bigint(20)   |
| date        | date         |
| views       | mediumint(6) |
+-------------+--------------+

这是我的clicks表格,它单独存储每次点击。(由于与问题不相关,所以省略了一些列)

+-------------+---------------------+
| COLUMN_NAME | COLUMN_TYPE         |
+-------------+---------------------+
| id          | bigint(20) unsigned |
| advert_id   | bigint(20)          |
| timestamp   | timestamp           |
+-------------+---------------------+

结果应如下所示(不使用实数,仅用于显示格式):

+------------+-------+--------+
| event_date | views | clicks |
+------------+-------+--------+
| 2016-05-09 |    25 |      4 |
| 2016-05-10 |     2 |        |
| 2016-05-11 |   105 |     10 |
| 2016-05-13 |    96 |      7 |
| 2016-05-14 |       |      1 |
+------------+-------+--------+

关于结果:

  • 并非每个日期都有点击或浏览
  • 某些日期可能没有浏览量,也没有点击
  • 某些日期可能没有点击,也没有观看次数

转到代码...这是我目前拥有的:

SELECT
    $views_table.date AS event_date,
    $views_table.views,
    '' AS clicks
FROM
    $views_table
WHERE
    ( $views_table.date BETWEEN '$from_date' AND '$to_date' )
    AND $views_table.advert_id=$advert_id
UNION
SELECT
    CAST($clicks_table.timestamp AS DATE) AS event_date,
    '' AS views,
    COUNT($clicks_table.advert_id) AS clicks
FROM
    $clicks_table
WHERE
    ( CAST($clicks_table.timestamp AS DATE) BETWEEN '$from_date' AND '$to_date' )
    AND $clicks_table.advert_id=$advert_id
GROUP BY
    event_date
ORDER BY
    event_date ASC;

有关代码的一些注意事项:

  • 点击次数是分别存储在时间戳记上的,因此必须将其转换为日期,然后按日期分组(或者至少这是我获得其他报告的有效结果的方式)。
  • 该报告将包含一个日期范围,并用于一个特定的广告。这是对where子句的说明。

在撰写这个问题时,我对代码进行了更好的格式化,为了便于阅读,我更改了选择语句的顺序,从而解决了我的第一个问题。显然,两个选择都必须具有相同的列并且具有相同的顺序。

我想我快到了,因为这是我目前的结果:

+------------+-------+--------+
| event_date | views | clicks |
+------------+-------+--------+
| 2016-05-09 | 1     |        |
| 2016-05-09 |       | 1      |
| 2016-05-10 | 2     |        |
| 2016-05-11 | 105   |        |
| 2016-05-11 |       | 7      |
| 2016-05-13 | 96    |        |
| 2016-05-13 |       | 16     |
| 2016-05-14 | 2     |        |
| 2016-05-14 |       | 1      |
| 2016-05-15 | 2     |        |
| 2016-05-15 |       | 2      |
+------------+-------+--------+

我剩下的问题是重复的日期我该如何解决?
非常感谢那些乐于回答的人!

保罗·斯皮格尔

我对查询做了一些修改(请参阅内联注释),并将其包装在子查询中以GROUP BY event_date在外部查询中使用。

SELECT event_date, MAX(views) AS views, MAX(clicks) AS clicks
FROM (
    SELECT
        views.date AS event_date,
        views.views,
        0 AS clicks -- '' causes strange results on sqlfiddle
    FROM
        views
    WHERE
        ( views.date BETWEEN '2016-05-09' AND '2016-05-15' )
        AND views.advert_id=1
    UNION
    SELECT
        CAST(clicks.timestamp AS DATE) AS event_date,
        0 AS views, -- '' causes strange results on sqlfiddle
        COUNT(clicks.advert_id) AS clicks
    FROM
        clicks
    WHERE
        ( CAST(clicks.timestamp AS DATE) BETWEEN '2016-05-09' AND '2016-05-15' )
        AND clicks.advert_id=1
    GROUP BY
        event_date
    -- ORDER BY is useless here
) sub
GROUP BY event_date
ORDER BY event_date

演示版

代替CAST(clicks.timestamp AS DATE)您还可以使用DATE(clicks.timestamp)并希望MySQL将来会使用索引。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

MySQL对两个表进行联合,其中一个带有时间戳,另一个带有日期

来自分类Dev

两个数组,一个有时间,另一个有时间

来自分类Dev

使用另一个包含要删除的时间戳的数组对带有时间戳的matlab数组进行子集

来自分类Dev

R 在一个带有时间戳的图形中的多行

来自分类Dev

在带有 gradle 的 NDK 上编译两个项目,其中一个依赖于另一个的二进制文件

来自分类Dev

找到带有时间戳的两个日期之间的分钟差异?

来自分类Dev

mysql - 如果其中一个具有另一个的外键,如何执行两个连接表的连接?

来自分类Dev

使用另一个包含要删除时间戳记的数组对带有时间戳记的matlab数组进行子集

来自分类Dev

给定一个带有时间段的表,查询每天的总和列表

来自分类Dev

两个带有外键的表引用另一个NameError

来自分类Dev

将文件从一个目录复制到另一个目录并附加带有时间戳的新文件,而不是在 Java 中覆盖

来自分类Dev

如何获得两个元组 - 一个带有单词,另一个带有长度?

来自分类Dev

在带有时间戳索引的数据框中创建一个12小时的循环

来自分类Dev

合并两个带有时间戳和队列长度的元组列表

来自分类Dev

如何使用timenow来获取带有两个日期的对象,即使其中一个日期是Django中的过去日期也是如此?

来自分类Dev

Linq Select方法,其中一个方法作为带有两个参数的参数

来自分类Dev

一次将两个记录插入两个表,其中一个表使用另一个作为外键?

来自分类Dev

查找两个表,其中一个表具有冗余值

来自分类Dev

Hibernate:如何用其中一个没有ID的两个表联接?

来自分类Dev

MySQL在一个表上合并两个带有CASE的SELECT查询

来自分类Dev

从另一个带有日期的列表生成一个列表

来自分类Dev

带有时间戳的巨大 CSV 文件,创建一个包含一年中每个月条目数的图表

来自分类Dev

是否有lodash函数来合并两个对象并删除其中一个的属性(如果另一个不存在)?

来自分类Dev

并排两个div,一个带有google map,另一个带有固定宽度

来自分类Dev

如何比较两个字符串,其中一个带有反引号

来自分类Dev

我创建了一个带有时间戳的文件,由于某种原因,我无法在文件中添加换行符

来自分类Dev

如何在我的所有屏幕上贴一个带有时间的标签

来自分类Dev

替换多个模式,其中一个带有方括号,另一个是制表符

来自分类Dev

MySQL在非唯一列上并在带有时间戳条件的情况下联接2个表

Related 相关文章

  1. 1

    MySQL对两个表进行联合,其中一个带有时间戳,另一个带有日期

  2. 2

    两个数组,一个有时间,另一个有时间

  3. 3

    使用另一个包含要删除的时间戳的数组对带有时间戳的matlab数组进行子集

  4. 4

    R 在一个带有时间戳的图形中的多行

  5. 5

    在带有 gradle 的 NDK 上编译两个项目,其中一个依赖于另一个的二进制文件

  6. 6

    找到带有时间戳的两个日期之间的分钟差异?

  7. 7

    mysql - 如果其中一个具有另一个的外键,如何执行两个连接表的连接?

  8. 8

    使用另一个包含要删除时间戳记的数组对带有时间戳记的matlab数组进行子集

  9. 9

    给定一个带有时间段的表,查询每天的总和列表

  10. 10

    两个带有外键的表引用另一个NameError

  11. 11

    将文件从一个目录复制到另一个目录并附加带有时间戳的新文件,而不是在 Java 中覆盖

  12. 12

    如何获得两个元组 - 一个带有单词,另一个带有长度?

  13. 13

    在带有时间戳索引的数据框中创建一个12小时的循环

  14. 14

    合并两个带有时间戳和队列长度的元组列表

  15. 15

    如何使用timenow来获取带有两个日期的对象,即使其中一个日期是Django中的过去日期也是如此?

  16. 16

    Linq Select方法,其中一个方法作为带有两个参数的参数

  17. 17

    一次将两个记录插入两个表,其中一个表使用另一个作为外键?

  18. 18

    查找两个表,其中一个表具有冗余值

  19. 19

    Hibernate:如何用其中一个没有ID的两个表联接?

  20. 20

    MySQL在一个表上合并两个带有CASE的SELECT查询

  21. 21

    从另一个带有日期的列表生成一个列表

  22. 22

    带有时间戳的巨大 CSV 文件,创建一个包含一年中每个月条目数的图表

  23. 23

    是否有lodash函数来合并两个对象并删除其中一个的属性(如果另一个不存在)?

  24. 24

    并排两个div,一个带有google map,另一个带有固定宽度

  25. 25

    如何比较两个字符串,其中一个带有反引号

  26. 26

    我创建了一个带有时间戳的文件,由于某种原因,我无法在文件中添加换行符

  27. 27

    如何在我的所有屏幕上贴一个带有时间的标签

  28. 28

    替换多个模式,其中一个带有方括号,另一个是制表符

  29. 29

    MySQL在非唯一列上并在带有时间戳条件的情况下联接2个表

热门标签

归档