Vinzenz Mai: MySQL Lösung JOIN/Subselect <==> PHP Version

Beitrag lesen

Hallo,

Immer wieder liest man hier im Forum, dass man besser direkte MySQL Abfragen machen soll anstatt es über PHP zu lösen.

in aller Regel ist dies der bessere Weg.

SELECT B.Kunde, A.IdKd,A.beschreibung, A.maschserien AS SerienNummer
From
software A
LEFT JOIN bestellung B ON B.IdKd = A.IdKd
WHERE SUBSTRING(A.maschserien, -6) IN
(SELECT SUBSTRING(X.maschserien, -6)

-- sowas ist übel, sehr übel.
-- nicht indizierbar, eine Performancebremse erster Güte

From
software X
WHERE X.maschserien != ""
GROUP BY SUBSTRING(X.maschserien, -6)
HAVING Count(*) > 1
ORDER BY X.IdKd ASC)
ORDER BY SUBSTRING(A.maschserien, -6) ASC, A.IdKd ASC

  
Es ist kein Wunder, dass diese Abfrage lahm ist.  
  

> Die Frage ist nun. Was ist sauberer, besser?  
  
Die einzig vernünftige Maßnahme wäre, das Tabellendesign zu reparieren. Wenn die letzten 6 Zeichen einer Zeichenkette eine Seriennummer sind, so ist es unabdingbar, dass diese in einer eigenen Spalte (mit einem Index) geführt werden. Der Inhalt der derzeitigen Spalte läßt sich ganz sicher über eine einfache Operation, z.B. in einem View, der den Namen der derzeitigen Tabelle erhalten wird, darstellen. Löse dieses Problem und Du löst die Performanceprobleme.  
  
  
Freundliche Grüße  
  
Vinzenz