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?

War es hilfreich?

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 die promo_code Verwendung wird eine temporäre Tabelle auf der Festplatte gewährleisten. Wahrscheinlich am besten, dass ein VARCHAR(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

ist
CONCAT( 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
scroll top