我試圖將一個廣告的性能報告放在一起,顯示它在一天中的觀看次數和點擊次數。視圖和點擊被存儲在具有不同結構的單獨表格中,所以我認爲我必須執行聯合。兩個表上的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。 –