MySQL-Unterabfrage mit benutzerdefinierten Variablen

8

Ich versuche, eine Abfrage durchzuführen, die eine berechnete Spalte mit einer Unterabfrage erfordert, die die Datumsreferenz über eine Variable übergibt. Ich bin mir nicht sicher, ob ich es nicht richtig mache, aber im Grunde endet die Abfrage nie und dreht sich für Minuten. Das ist meine Frage:

%Vor%

Unterabfrage hat eine inner join führt den Self-Join aus, der nur die Anzahl der Personen angibt, die vor dem Datum in @groupdate gekauft haben. Der EXPLAIN ist unter:

%Vor%

Und die Struktur der Tabelle _pj_cust_email_view ist als solche:

%Vor%

Wie gesagt, ich bin mir nicht wirklich sicher, dass dies der beste Weg ist, dies zu erreichen. Irgendwelche Kritik, Richtung wird geschätzt!

Aktualisieren

Ich habe ein paar Fortschritte gemacht und mache jetzt das oben beschriebene Verfahren, indem ich alle bekannten Monate statt Monate in der Datenbank durchlaufe und die Vars im Voraus setze. Ich mag das immer noch nicht. Das habe ich jetzt:

Legt die benutzerdefinierten vars fest

%Vor%

Ruft insgesamt verschiedene E-Mails im angegebenen Bereich ab

%Vor%

Ruft die Gesamtzahl der Kunden ab, die vor dem angegebenen Bereich gekauft haben

%Vor%

Dabei steht @startdate für den Anfang des Monats und @enddate für das Ende des Monatsbereichs.

Ich habe das Gefühl, dass dies in einer vollständigen Abfrage noch möglich ist.

    
philwinkle 23.02.2011, 16:09
quelle

2 Antworten

8

Ich glaube nicht, dass Sie überhaupt Unterabfragen verwenden müssen, noch müssen Sie über Monate iterieren.

Stattdessen empfehle ich Ihnen, eine Tabelle zu erstellen, in der alle Monate gespeichert werden. Selbst wenn Sie es mit 100 Jahren Monaten vorbesetzen, würde es nur 1200 Zeilen darin haben, was trivial ist.

%Vor%

Speichern Sie die tatsächlichen Start- und Enddaten, damit Sie den Datentyp DATE verwenden und die zwei Spalten richtig indizieren können.

edit: Ich denke, ich verstehe Ihre Anforderung ein wenig besser, und ich habe diese Antwort aufgeräumt. Die folgende Abfrage ist möglicherweise für Sie richtig:

%Vor%

Wenn Sie den folgenden zusammengesetzten Index in Ihrer Tabelle erstellen:

%Vor%

Dann hat die Abfrage die beste Chance, eine Nur-Index-Abfrage zu sein, und wird viel schneller ausgeführt.

Nachfolgend finden Sie den EXPLAIN-Optimierungsbericht dieser Abfrage. Beachten Sie type: index für jede Tabelle.

%Vor%

Hier sind einige Testdaten:

%Vor%

Hier ist das Ergebnis dieser Daten, einschließlich der verketteten Liste von E-Mails, um es einfacher zu sehen.

%Vor%     
Bill Karwin 01.03.2011, 23:24
quelle
0

Obwohl Bill eine nette Abfrage mit mehreren Tabellen hat, tut dies auch mit den SQL-Variablen, also keine extra Tabelle. Die innere Abfrage wird mit Ihrer _pj_cust_email_view-Tabelle verknüpft und führt ein Limit 10 aus, das bedeutet, dass nur 10 Monate vom aktuellen Monat zurückgehen. Also, keine harte Codierung von Daten, wird es im laufenden Betrieb berechnet ... Wenn Sie mehr oder weniger Monate wollen, ändern Sie einfach die LIMIT-Klausel.

Durch Setzen des @ dt: = als letztes Feld in der internen Abfrage wird nur DANN die Datumsbasis für den nächsten Datensatzzyklus zugewiesen, um Ihre qualifizierenden Daten zu erstellen ...

%Vor%     
DRapp 02.03.2011 01:35
quelle

Tags und Links