Hallo Fabienne,
leider ist meinOriginal-Posting schon im Archiv.
ZIEL:
alle Kundeninfos + der _eine_ Ansprechpartner für den Tourenplan, falls vorhanden + die Umsätze _mit_ dem Kunden, jeweils nur der letzte Eintrag, falls vorhanden ==> Ausgabe kommt später in eine CSV-Datei rein. Dort soll pro Zeile nur ein Kunde stehen mit den Ansprechpartnern und dem Umsatz.
-- Kontakte, die Ansprechpartner fuer Tourenplan sind (und zwar nur einer, falls mehrere vorhanden wären)
LEFT JOIN
(
SELECT k.* FROM customercontacts k WHERE k.ansprechpartner_tourenplan='ja' LIMIT 0,1
) kontakte
ON customers.id = kontakte.customer_id
Wieviele Kunden haben mehr als einen Ansprechpartner?
Über das DB-Design kannst Du erzwingen, dass es maximal nur einen gibt, ein typischer Fall für eine 1:1-Beziehung.
Das erspart Dir das Subselect mit dem üblen LIMIT.
LIMIT kann ein Performance-Killer sein. Befrage EXPLAIN.
-- Umsatz _mit_ Kunde aus Vorjahr, letzter Eintrag, nur ein Eintrag, falls mehrere vorhanden
LEFT JOIN
(
SELECT u.* FROM turnover u
Warum schon wieder SELECT *? SELECT * ist böse[tm]. Du benötigst doch nur die Spalte für den Umsatz (was) und die Spalte id für den Join.
MySQL-Server hat sich aufgehängt, CPU 100% Last!
Habe ich da irgendwo einen Zirkelbezug drin (Schleife??)?
Immer hübsch der Reihe nach vorgehen, das ist gerade in diesem Fall wunderbar einfach.
1. Teste die beiden Subselects einzeln. Schau Dir außerdem das Ergebnis von EXPLAIN an.
2. Füge zu den Kundendaten (aus customers) sukzessive die beiden Jahresumsätze hinzu.
Schau auf die Performance, schau auf EXPLAIN.
Füge zum Schluß den Ansprechpartner hinzu, ein Blick auf die Performance und EXPLAIN.
3. Füge zu den Kundendaten nur den Ansprechpartner hinzu, Blick auf die Performance und EXPLAIN.
Optimierungsmöglichkeiten:
Die Umsätze der Kunden aus den vergangenen Jahren sollten sich nur noch selten ändern. Hier bietet sich eine Archivierung in einer eigenen Tabelle an, die im Vergleich zum Subselect deutlich schneller sein sollte. Die Archivierung könnte grundsätzlich über einen Trigger (ab MySQL 5.0) erfolgen.
Die id ist ja mehrfach vergeben. Wie komme ich an die einzelnen IDs?
Über Aliasnamen. Wobei mir schleierhaft ist, welche Hilfe diverse id-Werte in einem Tourenplan darstellen.
Nur über z.B. $array[71] anstelle $array[id]?
Bei den einzeln definierten Vars geht das ja einfacher: $array[ansprechpartner_tourenplan]....
Gibt es da noch ne andere Möglichkeit außer der umständlichen Methode "... AS neuer_name"?
Ich finde Aliasnamen sehr angenehm und alles andere als umständlich.
Allerdings verwende ich so gut wie nie das kurze und doch extrem unübersichtliche SELECT * ... und ganz besonders nicht bei Abfragen, die hundert und mehr Spalten haben.
Freundliche Grüße
Vinzenz