Nehmen wir an, ich habe die folgende Tabelle mit dem Namen video_data
. Ich habe eine andere videos
, die aber nicht wirklich relevant ist. Ich verwende es, um Videos für einen bestimmten Kanal abzufragen, aber das würde die Abfrage nicht ändern. Es ist nur, um die Berechnungen für einen Kanal statt aller zu erhalten.Erhalten Datenbank Datensätze, die innerhalb eines bestimmten Zeitraums sind
Was ich jetzt tun möchte, ist es, den Durchschnittswert von Ansichten innerhalb eines Zeitrahmens zu erhalten. Nehmen wir an, ich möchte die durchschnittlichen Aufrufe eines Videos innerhalb von 2 Stunden abrufen. Lassen Sie uns dies mit dem Video mit der video_ 1
als Beispiel tun
Also was ich tun müsste, wäre das folgende. Ich müsste den Durchschnittswert von id: 1
und id: 4
erhalten. Dies wäre 1250
, weil es (1000 + 1500)/2
ist. Als nächstes müsste ich den Durchschnitt von id: 4
und id: 7
bekommen. Dies wäre 3250
, weil es (1500 + 5000)/2
ist. Jetzt ist der Durchschnitt, den das Video in zwei Stunden bekommt, 2250
, weil es (1250 + 3250)/2
ist, richtig?
Nun, was ich keine Ahnung habe, ist, wie man das von MySQL bekommt. Ist es überhaupt möglich, in reinem MySQL zu arbeiten? Ich brauche das für viele, viele video_data. Wie ich Daten für über 100 Stunden habe! Und wenn die Daten mit id: 100
und id: 105
weniger als zwei Stunden voneinander entfernt sind, würde ich noch benötigen, dass diese Daten auch für die Berechnung berechnet werden.
Ich wollte es irgendwie wie diese
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'
tun, aber diese mir gibt einfach jedes Ergebnis, weil das Ergebnis von TIMEDIFF
immer 00:00:00
ist ich für diesen
ein SQL Fiddle erstellt MySQL 5.6 Schemaeinstellung:
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');
Wenn ich ausführen jetzt die Abfrage
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 |
+-----------+-------------+-----------+
Aber wenn sie über die Ergebnisse geht es wie der likes
Wert aussieht, ist der Durchschnitt der ALLE Gleichen in der Datenbank, und nicht nur diejenigen, die nur 2 Stunden voneinander entfernt, oder? Oder ist es richtig?
arbeiten "richtig?" Wie würden wir wissen? – Strawberry
ID 4 und ID 7 scheinen für das gleiche Video am selben Tag zu sein, daher bin ich verwirrt, warum dies separate Zeilen wären. – Strawberry
Es gibt keine channel_id und keine klare Erklärung, wie der Zeitrahmen definiert ist. – Strawberry