[英]Get database records which are within a specific timeframe
我們假設我有下面的表名為video_data
。 我有另外一個videos
雖然不是很相關。 我用它來查詢特定頻道的視頻,但這不會改變查詢。 這只是為了獲得一個通道的計算而不是全部。
+----+----------+-------+---------------------+
| id | video_id | views | created_at |
+----+----------+-------+---------------------+
| 1 | 1 | 1000 | 2016-04-26 00:00:00 |
| 2 | 2 | 500 | 2016-04-26 00:00:01 |
| 3 | 3 | 2500 | 2016-04-26 00:00:02 |
| 4 | 1 | 1500 | 2016-04-26 02:00:00 |
| 5 | 2 | 1000 | 2016-04-26 02:00:01 |
| 6 | 3 | 3000 | 2016-04-26 02:00:02 |
| 7 | 1 | 5000 | 2016-04-26 04:00:00 |
| 8 | 2 | 10000 | 2016-04-26 04:00:01 |
| 9 | 3 | 30000 | 2016-04-26 04:00:02 |
+----+----------+-------+---------------------+
我現在要做的是獲取時間范圍內的視圖的平均值。 讓我們說,我希望在2小時內獲得視頻的平均觀看次數。 我們以video_ 1
為視頻,以視頻為例
所以我需要做的是以下內容。 我需要得到id: 1
和id: 4
的平均值。 這將是1250
因為它是(1000 + 1500) / 2
。 接下來我需要獲得id: 4
和id: 7
的平均值。 這將是3250
因為它是(1500 + 5000) / 2
。 現在兩小時內視頻的平均值是2250
因為它是(1250 + 3250) / 2
,對嗎?
現在我不知道,是如何從MySQL獲得這個。 甚至可以在普通的MySQL中做到嗎? 對於很多很多的video_data我需要這個。 就像我有超過100小時的數據! 如果id: 100
且id: 105
的數據彼此相距不到兩小時,我仍然需要計算這些數據。
我想以某種方式這樣做
select *
from `video_data`
where `video_id` in (select `id` from `videos` where `channel_id` = 1)
and TIMEDIFF(`created_at`, `created_at`) < '02:00:00'
但這只會讓我回復每一個結果,因為TIMEDIFF
的結果總是00:00:00
我為此創建了一個SQL小提琴
MySQL 5.6架構設置 :
CREATE TABLE `video_data` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`video_id` int(10) unsigned NOT NULL,
`shares` int(11) DEFAULT NULL,
`likes` int(11) DEFAULT NULL,
`comments` int(11) DEFAULT NULL,
`total_count` int(11) DEFAULT NULL,
`created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
INSERT INTO `video_data` (`id`, `video_id`, `shares`, `likes`, `comments`, `total_count`, `created_at`, `updated_at`)
VALUES
(1889612, 245721, 777, 69922, 1314, 72013, '2015-10-04 20:00:04', '2015-10-04 20:00:04'),
(1896986, 245721, 970, 90611, 1570, 93151, '2015-10-04 21:00:04', '2015-10-04 21:00:04'),
(1904145, 245721, 1121, 104636, 1725, 107482, '2015-10-04 22:00:05', '2015-10-04 22:00:05'),
(1911872, 245721, 1199, 115389, 1838, 118426, '2015-10-04 23:00:04', '2015-10-04 23:00:04'),
(1882621, 245007, 1651, 102569, 2659, 106879, '2015-10-04 19:00:06', '2015-10-04 19:00:06'),
(1889613, 245007, 1769, 113910, 2775, 118454, '2015-10-04 20:00:05', '2015-10-04 20:00:05'),
(1896988, 245007, 1829, 121646, 2851, 126326, '2015-10-04 21:00:05', '2015-10-04 21:00:05'),
(1904150, 245007, 1889, 127677, 2917, 132483, '2015-10-04 22:00:06', '2015-10-04 22:00:06'),
(1911877, 245007, 1914, 132764, 2957, 137635, '2015-10-04 23:00:05', '2015-10-04 23:00:05'),
(1845984, 239950, 675, 75030, 1373, 77078, '2015-10-04 12:00:04', '2015-10-04 12:00:04'),
(1849749, 239950, 857, 97028, 1617, 99502, '2015-10-04 13:00:05', '2015-10-04 13:00:05'),
(1853996, 239950, 1021, 113648, 1801, 116470, '2015-10-04 14:00:04', '2015-10-04 14:00:04'),
(1858726, 239950, 1148, 126624, 1919, 129691, '2015-10-04 15:00:04', '2015-10-04 15:00:04'),
(1863954, 239950, 1297, 137950, 2019, 141266, '2015-10-04 16:00:04', '2015-10-04 16:00:04'),
(1869723, 239950, 1427, 148069, 2102, 151598, '2015-10-04 17:00:04', '2015-10-04 17:00:04'),
(1875982, 239950, 1549, 156391, 2194, 160134, '2015-10-04 18:00:05', '2015-10-04 18:00:05'),
(1882622, 239950, 1618, 161312, 2232, 165162, '2015-10-04 19:00:07', '2015-10-04 19:00:07'),
(1889616, 239950, 1683, 164783, 2261, 168727, '2015-10-04 20:00:06', '2015-10-04 20:00:06'),
(1896990, 239950, 1722, 167718, 2278, 171718, '2015-10-04 21:00:06', '2015-10-04 21:00:06'),
(1904151, 239950, 1743, 170240, 2290, 174273, '2015-10-04 22:00:07', '2015-10-04 22:00:07'),
(1911880, 239950, 1761, 172363, 2300, 176424, '2015-10-04 23:00:06', '2015-10-04 23:00:06');
當我現在執行查詢
select avg(pd.shares) AS shares, avg(pd.likes) AS likes, avg(pd.comments) AS comments FROM video_data pd JOIN video_data pd1 ON pd1.video_id = pd.`video_id` AND TIMEDIFF(pd.created_at, pd1.created_at) <= '02:00:00';
+-----------+-------------+-----------+
| shares | likes | comments |
+-----------+-------------+-----------+
| 1298.2077 | 123542.5769 | 2032.2769 |
+-----------+-------------+-----------+
但要在結果時,它看起來像likes
值為ALL的平均數據庫中的喜歡,而不僅僅是那些只有誰可在2小時彼此分開,對不對? 還是正確的?
select t.*,avg(t1.views) from videos t join videos t1 on
t1.video_id=t.video_id
and timediff(t.created_at,t1.created_at)< '02:00:00'
group by t.video_id
嘗試這個查詢它應該工作
但這只會讓我回復每一個結果,因為TIMEDIFF的結果總是00:00:00
這樣做是因為你使用了相同的列:
TIMEDIFF(`created_at`, `created_at`)
所以幾乎不可能讓它產生不同的結果。 您可能想使用NOW()
作為參數之一?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.