Effizienteste Weg in MySQL auf Werte in einer bestimmten Woche abrufen?
-
09-10-2019 - |
Frage
Ich brauche einen Bericht zu erstellen, der die Zählung jedes bestimmten Promotion-Code innerhalb einer bestimmten Woche verwendet wird, liefert. Beispiel Tabellenstruktur:
CREATE TABLE `user_promo_codes` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`user_id` bigint(20) unsigned NOT NULL,
`promo_code` longtext NOT NULL,
`last_updated` datetime NOT NULL,
PRIMARY KEY (`id`),
)
Was ich will, ist eine Zählung eines jeden bestimmten Code promo in einer bestimmten Woche. Was ich habe jetzt:
SELECT promo_code, count(*) AS count
FROM user_promo_codes
WHERE last_updated BETWEEN
FROM_UNIXTIME( # one week ago
UNIX_TIMESTAMP( DATE_SUB( NOW(), INTERVAL 7 DAY ) ) - TIME_TO_SEC( NOW() )
)
AND
FROM_UNIXTIME(
UNIX_TIMESTAMP( NOW() ) - TIME_TO_SEC( NOW() )
)
GROUP BY value
Gibt es eine effizientere Art und Weise, dies zu tun?
Lösung
Für die Datentypen, die Sie gezeigt haben, sollte dies gut funktionieren für die Woche vor zu jetzt .
SELECT promo_code, COUNT(*) AS count
FROM user_promo_codes
WHERE last_updated BETWEEN DATE_SUB( NOW(), INTERVAL 7 DAY ) AND NOW()
GROUP BY promo_code
Asides:
- eine
LONGTEXT
für diepromo_code
Verwendung wird eine temporäre Tabelle auf der Festplatte gewährleisten. Wahrscheinlich am besten, dass einVARCHAR(N)
zu machen. - Wie middaparka erwähnt, ein Index für
last_updated
wird von unschätzbarem Wert sein, wie die Tabelle wächst.
Aktualisieren
Mit NOW()
. -> der jüngsten Wedneday @ 00:00:00
SELECT promo_code, COUNT(*) AS count
FROM user_promo_codes
WHERE last_updated BETWEEN
DATE_SUB( CONCAT( DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE())+5 DAY) ,' 00:00:00'), INTERVAL 7 DAY )
AND
CONCAT( DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE())+5 DAY) ,' 00:00:00')
GROUP BY promo_code
Das ist nur die oben mit
istCONCAT( DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE())+5 DAY) ,' 00:00:00')
tauschte in der NOW()
s.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow