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?

È stato utile?

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 la promo_code garantirà una tabella temporanea su disco. Probabilmente meglio per fare che un VARCHAR(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
scroll top