Fabienne: Geschwindigkeit und Performance PHP - MySQL II

Beitrag lesen

Hallo und guten Abend,

ich habe nochmals eine Anmerkung:

Folgendes funktioniert auch nicht (MAX(id)):

-- Umsatz aus Vorjahr
LEFT JOIN
  (
    SELECT u.wert_gesamt,u.customer_id FROM turnover u
        WHERE
           u.id=(SELECT MAX(u2.id) FROM turnover u2
                    WHERE
                      u2.customer_id=u.customer_id
                     AND
                      u2.jahr='2007')
            AND
              u.jahr='2007'
  ) umsatz_vorjahr
ON customers.id = umsatz_vorjahr.customer_id

Aber: Das funktioniert:

-- Kontakte einsammeln
LEFT JOIN
  (
    SELECT k.name,k.customer_id,k.ansprechpartner_tourenplan FROM customercontacts k
              WHERE
                k.ansprechpartner_tourenplan='ja'
                AND k.id=(SELECT MIN(k2.id) FROM customercontacts k2 WHERE k.ansprechpartner_tourenplan='ja' AND k2.customer_id=k.customer_id)

) kontakte
ON customers.id = kontakte.customer_id

Vom Prinzip her sind beie Abfragen gleich.
Aber: Die erste funktioniert nur solange, solange im SUBSELECT kein Bezug zunm Hauptselect über u2.customer_id=u.customer_id hergestellt wird. Die zweite funktioniert immer - auch mit k2.customer_id=k.customer_id

Darf man im SUBSELECT mit LIMITs arbeiten?

Idee:

-- Umsatz aus Vorjahr
LEFT JOIN
  (
    SELECT u.wert_gesamt,u.customer_id FROM turnover u
        WHERE
           u.id=(SELECT u2.id FROM turnover u2
                    WHERE
                      u2.customer_id=u.customer_id
                     AND
                      u2.jahr='2007' ORDER BY u2.id LIMIT 0,1)
            AND
              u.jahr='2007'
  ) umsatz_vorjahr
ON customers.id = umsatz_vorjahr.customer_id

Ja, es funktioniert, aber:
Es geht wieder nur solange, bis die Relation zwischen u.customer_id=u2.customer_id hergestellt wird. Danach läuft das Skript sich tot.

MySQL 4.1.10
Indexe sind auf die jeweiligen Spalten gesetzt.

Hat sonst noch jemand eine Idee?
Bin am verzweifeln....

Viele Grüße
Fabienne