2016-08-01 16 views
1

Problem BeschreibungWie ersten Monat der Daten für jeden Benutzer

Ich habe eine Datentabelle multiplayergame, wo es mehrere Datensätze für jeden UserID Detaillierung ihrer Aktivitäten in diesem Multiplayer-Spiel abfragen, und das Datum DateID, dass das Spiel trat auf.

Frage

Wie kann ich abfragen, um die Spiele für jeden Benutzer, der innerhalb den ersten Monat ihres ersten Spiels auftreten? d. h. Alle Zeilen für diesen Benutzer abholen, die innerhalb von 30 Tagen nach dem ersten Datensatz für ihr erstes Multiplayer-Spiel auftreten?

+0

Sie können 'between' 30 Tagen ab dem Startdatum und sys.date –

+0

Aber jeder Benutzer hat einen anderen Starttermin; ein Benutzer könnte sein erstes Auftreten im November 2013, im Januar 2014 usw. gehabt haben. Wäre Ihre Lösung nicht nur der erste Monat der Daten, Zeitraum? Keine Erfassung der Daten für Benutzer, die nach dem ersten Monat gestartet sind? – potatosoup

+0

Willkommen bei SO. Bitte lesen Sie [Welche Themen kann ich fragen] (http://stackoverflow.com/help/on-topic) und [Wie man eine gute Frage stellt] (http://stackoverflow.com/help/how-to -ask) Und [die perfekte Frage] (http://codeblog.jonskeet.uk/2010/08/29/writing-the-perfect-question/) Und [Wie ein minimales, komplettes und überprüfbares Beispiel zu erstellen] (http://stackoverflow.com/help/mcve) SO ist ** nicht eine kostenlose Codierung oder Code-Konvertierung oder Debugging oder Tutorial oder Bibliothek Finding-Service ** Sie müssen auch zeigen, dass Sie einige Anstrengungen unternommen haben, um Ihre zu lösen eigenes Problem. – RiggsFolly

Antwort

1

Dieser wird langsam sein, wenn Sie viele Benutzer haben, aber es wird funktionieren. Die Unterabfrage erhält eine Liste der UserIDs und der DateID ihres ersten Spiels und wählt dann alle Spiele aus, bei denen die DateID zwischen diesem Datum und den nächsten 30 Tagen liegt (für jeden Benutzer). Wenn Sie das erste Spieldatum der Benutzertabelle hinzugefügt oder das Datum created_at des Benutzers verwendet haben, können Sie es aufgrund der vollen Verwendung von Indizes erheblich beschleunigen.

SELECT * FROM multiplayergame m1 
JOIN (SELECT MIN(m.DateID) as first_game, m.UserID 
FROM multiplayergame m 
GROUP BY m.UserID) der on der.UserID=m1.UserID and m1.DateID BETWEEN der.first_game AND der.first_game + INTERVAL 30 DAY 
+0

Danke! Ihre Lösung wirkt wie ein Zauber. Prost – potatosoup

0

So etwas wie die folgenden finden Sie die Zeilen geben:

WHERE create_date BETWEEN create_date() AND DATE_ADD(create_date, INTERVAL 30 DAY) 
0

Ja wie @Pritam Banerjee ‚s Antwort CURDATE(). Aber wähle Tabellen *.

SELECT * 
FROM multiplayergame 
WHERE DateID BETWEEN CURDATE() - INTERVAL 30 DAY AND CURDATE() 

Sie könnten auch NOW() verwenden

SELECT * 
FROM multiplayergame 
WHERE DateID BETWEEN NOW() - INTERVAL 30 DAY AND NOW() 
Verwandte Themen