modo più efficiente in MySQL per recuperare i valori in una settimana?
-
09-10-2019 - |
Domanda
Ho bisogno di produrre un rapporto che prevede il conteggio di ciascun codice promozionale utilizzato all'interno di una settimana particolare. struttura della tabella Esempio:
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`),
)
Quello che voglio è un conteggio di ogni codice promozionale particolare utilizzato in una determinata settimana. Quello che ho in questo momento:
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
C'è un modo più efficiente di fare questo?
Soluzione
Per i tipi di dati avete dimostrato, questo dovrebbe funzionare bene per la settimana precedente a oggi .
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
Le divagazioni:
- Utilizzo di un
LONGTEXT
per lapromo_code
garantirà una tabella temporanea su disco. Probabilmente meglio per fare che unVARCHAR(N)
. - Come middaparka notato, un indice su
last_updated
diventerà prezioso come la tabella cresce.
Aggiorna
Con NOW()
-.> La più recente 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
che è solo il sopra con il
CONCAT( DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE())+5 DAY) ,' 00:00:00')
scambiati in per i NOW()
s.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow