我试图将一个广告的性能报告放在一起,显示它在一天中的观看次数和点击次数。视图和点击被存储在具有不同结构的单独表格中,所以我认为我必须执行联合。两个表上的MySQL联盟,其中一个带有时间戳,另一个带有日期
我已阅读并理解this fantastic piece。它帮助了我,但我认为这是比这里解释的例子更复杂的一个层次。希望得到社区的帮助。
这是我的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子句。
在撰写此问题时,我将代码格式化得更好一些,而且为了便于阅读,我更改了解决最初问题的select语句的顺序。显然,两个选择都必须具有相同的列并且具有相同的顺序。
我觉得我几乎没有,因为这是我目前的结果是:
+------------+-------+--------+
| 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。 –