2016-04-26 12 views
3

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?

+0

arbeiten "richtig?" Wie würden wir wissen? – Strawberry

+0

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

+0

Es gibt keine channel_id und keine klare Erklärung, wie der Zeitrahmen definiert ist. – Strawberry

Antwort

0

aber das gibt einfach mich jedes Ergebnis, weil das Ergebnis TIMEDIFF immer 00:00:00

Es tut so becauase Sie die gleiche Spalte verwendet:

TIMEDIFF(`created_at`, `created_at`) 

so ist es kaum möglich, es zu einem anderen Ergebnis zu bringen. Vielleicht wollten Sie NOW() als eines der Argumente verwenden?

+0

Ich habe das verstanden. Es war nur ein Beispiel, wie ich versucht habe, das Ergebnis zu erhalten, aber es ist fehlgeschlagen. 'NOW()' würde jedoch nicht funktionieren, da die video_data 10 und 12 Stunden alt sein könnten und immer noch berechnet werden müssten, da diese beiden Daten eine Zeitdifferenz von 2 Stunden haben. – Musterknabe

+0

@MarcinOrlowski Sie sind absolut richtig, aber beantworten nicht die Frage –

1
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 

versuchen, diese Abfrage sollte es

+0

Typo: 'created_at' nicht' crated_at' –

+0

wird es ändern @MarcinOrlowski –

+0

Geben Sie mir bitte eine Sekunde, ich werde versuchen, zu überprüfen, ob das die richtigen Werte zurückgibt – Musterknabe

Verwandte Themen