phpbar.de logo

Mailinglisten-Archive

Select und Maximalwert

Select und Maximalwert

Andre Krajnik mysql_(at)_lists.phpcenter.de
Mon, 14 May 2001 20:13:42 +0200


Hi Alexander,

Alexander Friess schrieb:
> 
> Hallo Andre,
> > Kunde, PreisA, PreisB, ValidFrom, ValidTo, Zaehler
> >
> > Es kann also je Kunde mehrere Einträge geben, ich will aber
> > den NEUESTEN
> > haben. Das ist der mit dem jüngsten ValidFrom-Datum und ohne
> > ValidTo-Datum bzw. der mit dem höchten Zaehler je Kunde.
> die doppelte Bedingung ist schwierig in einem select unterzubringen, da
> mysql (noch) keine unions unterstützt.
> 
> Jüngstes validFrom:
> Wenn IMMER validTo NULL ist, dann so:
> "select validFrom, kunde where validTo IS NULL"
> Wie gesagt, WENN validTo IMMER NULL ist!!

Risiko wg. NULL :-(( 

> Wenn Du immer das kleinste Datum haben willst, dann gruppieren:
> "select min(validFrom), kunde group by kunde"
> So erhälst Du eine Liste mit genau einem EINTRAG PRO KUNDE.

Das hier kling sogar so gut, daß ich mein Provisorium mit dem Zähler
(wohl) nicht brauche! Das muß ich mal prüfen. Primärschlüssel ist
"Kunde", eine Kurzbezeichnung des Kundennames.

> 
> Höchsten Zähler analog:
> "select max(zaehler), kunde group by kunde"
> So erhälst Du eine Liste mit genau einem EINTRAG PRO KUNDE.

Stimmt! Aber nicht den, der zu dem Datum gehört. Oder soll ich das so
verstehen, daß ich diese Datumsangabe als Where-Cluase beim nächsten
("echten") Select nutze?

> 
> Eine Variante zur Simulation des union ist die, wenn Du die beiden Abfragen
> nacheinander ausführst und die Ergebnisse, d. h. die Kundenkennung, in eine
> temporäte Tabelle schreibst und dann Deine Abrechnung laufen läßt. Evtl.
> besteht auch die Möglichkeit, Deine Tabelle Konditionen noch einmal zu

Wie meinst Du das? Nach wäre tatsächlich eine Überarbeitung möglich. Es
sind zwar schon gut 300-Datensätze drin, aber die kann man notfalls ja
auch noch umschaufeln.

> überarbeiten. Wie wäre es, die aktuellen Daten UND die Daten des Vormonats
> in eine eigene Tabelle zu schreiben und am Monatsende während des

Insert into Vormonate (abc, def, ghi, jkl)
 select abc, def, ghi, jkl 
 from Abrechnungsdaten
 where Monat = $vormonat


Oder gibts's was schnelleres / besseres?

> Abrechnungslaufes die Daten in eine andere Tabelle auszulagern? Könnte evtl.
> auch die Performance im laufenden Monat drastisch erhöhen, da Du nur die
> aktuellen Daten im Zugriff hast.

Das hier klingt auch Klasse.

Ab wo wird's denn kritisch? Die Abrechnung läuft nachts (Perl) und macht
folgendes:
1. Abfrage auf Abrechnugsdaten
   a) sum(Wert1) je Kunde
   b) avg(Wert2) je Kunde
   c) avg(wert3) je Kunde
2. Holen der Kundendaten
3. Holen der Konditionen
4. Schreiben der Rechnungsdaten in Tabelle
5. Versand der Rechnungen per Mail

> 
> Gruß Alexander
> 

-- 
mfg

Andre

---
*** Weitere Infos zur Mailingliste und MySQL unter http://www.4t2.com/mysql 



php::bar PHP Wiki   -   Listenarchive