2017-03-29 2 views
0

Ich habe eine Tabelle mit der Struktur folgen:Wie kann ich diese gruppierten Daten nach Spaltenwert in MYSQL trennen?

SELECT * FROM logs WHERE data = "Map load" 
ORDER BY timestamp DESC LIMIT 5 

user_id timestamp   data 
3  2017-03-29 18:11:25 Map load 
2  2017-03-29 18:10:11 Map load 
5  2017-03-29 18:02:07 Map load 
5  2017-03-29 17:48:03 Map load 
3  2017-03-29 17:38:48 Map load 

ich zu Gruppenzeilen will von Intervallen von 15 Minuten, die ich getan habe. Allerdings muss ich diese Daten auch nach user_id segmentieren.

durch Intervall gruppierte:

SELECT FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(timestamp)/900)*900) AS `Time`, 
COUNT(*) AS `Map Load` FROM logs 
WHERE data = "Map load" 
GROUP BY `Time` ORDER BY `Time` DESC LIMIT 3 

Time    Map Load 
2017-03-29 18:00:00 3 
2017-03-29 17:45:00 1 
2017-03-29 17:30:00 1 

Gewünschtes Ergebnis Layout:

Time    user_id=3 user_id=2 user_id=5 
2017-03-29 18:00:00 1   1   1 
2017-03-29 17:45:00 0   0   1 
2017-03-29 17:30:00 1   0   0 

ich andere 60 Benutzer haben, so anders als für jedes user_id auf den 15min Intervall Zeitstempel eine Kopie dieser Tabelle beitreten, Gibt es eine andere Methode, dies zu tun?

Antwort

1

können Sie verwenden bedingte Aggregation für diese:

select FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(timestamp)/900) * 900) as time, 
    sum(user_id = 3) as User_id_3, 
    sum(user_id = 2) as User_id_2, 
    sum(user_id = 5) as User_id_5 
from logs 
where data = "Map load" 
group by time 
order by time desc LIMIT 3 

Wenn Sie mehr Anzahl von Benutzern haben, ist es ratsam, nicht Pivot Werte in SQL, sondern es Code, den Sie Anwendung tun:

select FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(timestamp)/900) * 900) as time, 
    user_id, 
    count(*) as cnt 
from logs l 
join (
    select FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(timestamp)/900) * 900) as time 
    from logs 
    group by time 
    order by time desc limit 3 
    ) t on FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(timestamp)/900) * 900) = t.time 
where data = 'Map load' 
group by time, 
    user_id 
order by time desc; 
+0

Das funktioniert gut, aber für mehr als 60 Benutzer ist es sinnvoll, linear wachsende Abfrage zu haben, wie mehr Benutzer beitreten? Ich bin nicht sicher, dass dies wartbar wäre, es sei denn, es gibt eine Möglichkeit, dass ich das für jede user_id generieren kann. 'SELECT user_id FROM users' –

+0

@ Lawrence_1718 - In diesem Fall nicht die Tabellendaten in SQL. Tun Sie es in Ihrem Anwendungscode. Die Antwort wurde ebenfalls aktualisiert. – GurV

+0

danke für den Rat, aber ich habe jetzt nicht viel Auswahl, brauche dies für Daten, die bereits generiert wurde, danke für die Hilfe! –