Ich habe die folgende MySQL-Abfrage und versuche, sie so anzupassen, dass nur Ergebnisse abgerufen werden, die innerhalb des aktuellen Monats (des aktuellen Jahres) liegen. Vermutlich benötigen Sie weitere Informationen zu meiner MySQL-Struktur - Ich habe einen UNIX-Zeitstempel, der von PHPs time()
generiert wurde und in der Spalte time
(unter der Tabelle referrals
) gespeichert ist. In der folgenden Konfiguration wäre dies also t2.time
.
Mein Problem ist also, dass ich mir nicht sicher bin, wie ich vorgehen soll. Ich vermute, es wäre so etwas wie das Hinzufügen des Folgenden zum Ende der WHERE
-Klausel? => AND t2.time IS WITHIN THE CURRENT MONTH
(Großbuchstaben dienen nur zur Unterscheidung des Problems vom Rest der Abfrage) aber ich bin nicht sicher, wie ich überprüfen soll, ob es innerhalb des aktuellen Monats liegt.
Die MySQL-Abfrage:
SELECT t1.username,
t1.website,
SUM(IF(t2.type = 'in', 1, 0)) AS in_count,
SUM(IF(t2.type = 'out', 1, 0)) AS out_count
FROM users AS t1
JOIN referrals AS t2
ON t1.username = t2.author
WHERE t1.website != ''
GROUP BY t1.username,
t1.website
ORDER BY in_count DESC
LIMIT 0, 10
Ich bedanke mich für jede Hilfe! : B
sie können from_unixtime
like verwenden
date_format(from_unixtime(t2.`time`), '%Y-%m')=date_format(now(), '%Y-%m')
Ich denke jedoch, dass der Datentyp integer
für diese Anforderung nicht geeignet ist
Ich würde mir vorstellen, dass die Verwendung von datetime
besser geeignet ist. Erstellen Sie einen Index für diese Spalte und vereinfachen Sie so auch das Filtern
t2.`time`>='2011-01-01' and t2.`time`<'2011-02-01'
oder
date_format(t2.`time`, '%Y-%m')=date_format(now(), '%Y-%m')
where t2.time >= extract(YEAR_MONTH from CURRENT_DATE)
and t2.time < extract(YEAR_MONTH from CURRENT_DATE + INTERVAL 1 MONTH)
Dies setzt voraus, dass t2.time ein datetime-Typ ist. Wenn es sich um einen ganzzahligen Unix-Zeitstempel handelt, können Sie die von uns erstellten oberen und unteren Datenzeitgrenzen mithilfe der Funktion UNIX_TIMESTAMP () konvertieren.
Dies ist wahrscheinlich viel einfacher als Sie erwarten werden.
SELECT t1.username,
t1.website,
SUM(IF(t2.type = 'in', 1, 0)) AS in_count,
SUM(IF(t2.type = 'out', 1, 0)) AS out_count
FROM users AS t1
JOIN referrals AS t2
ON t1.username = t2.author
WHERE t1.website != ''
AND t2.time >= DATE_SUB( CURRENT_DATE, INTERVAL 1 DAY )
GROUP BY t1.username,
t1.website
ORDER BY in_count DESC
LIMIT 0, 10
Um eine bessere Leistung zu erzielen (-> Verwenden Sie den Index), erstellen Sie einen Index für Ihre Datumsspalte und verwenden Sie ein "zwischen" in Ihrer where-Klausel.
select ... from my_table where my:date_field between concat(YEAR(CURRENT_DATE()),'-',MONTH(CURRENT_DATE()),'-01')
and adddate(concat(YEAR(CURRENT_DATE()),'-',MONTH(CURRENT_DATE()),'-01'), interval 1 month);