Rolf B: Komplexe MySQL Abfrage

Beitrag lesen

Hallo Dustin,

danke, dass Du deinen Code vorstellst. Ich hätte ein paar Verbesserungsvorschläge für Dich.

Punkt 1: mysql ist deprecated, nimm mysqli oder PDO.

Punkt 2: Die User-ID hast Du hoffentlich vor Aufruf der Funktion gesäubert, sonst injiziert Dir damit noch jemand irgendwelchen Müll. Mit mysqli kannst Du Parameter an SQL-Platzhalter binden, dann übernimmt das API die Absicherung für Dich.

Punkt 3: Du kannst auf die Schleife verzichten. Ein SELECT Statement erwartet in der FROM Klausel nicht Tabellen, sondern Tabellenausdrücke. Ein Tabellenausdruck kann eine einfache Table sein, ein JOIN, oder ein SELECT. Dieser weitere Select braucht lediglich einen Aliasnamen, sonst meckert der Server. Und soweit ich weiß, darf der innere Select kein ORDER BY haben, sortiert wird immer nur am Ende. GROUP BY und HAVING sind im inneren Select kein Problem.

Abstraktes Beispiel:

SELECT MAX(X.a), MAX(X.b), MAX(X.c), MAX(X.d)
FROM (SELECT a,b,c,d FROM tabA JOIN tabB on tabA.x=tabB.y WHEREUNION
      SELECT a,b,c,d FROM tabC WHERE) X

Die Spaltennamen und -typen werden vom ersten SELECT einer UNION Gruppe festgelegt. Wenn Du andere festlegen willst (oder musst, weil Du einen Ausdruck in der SELECT Liste hast), vergebe im ersten SELECT Aliasnamen (SELECT xyz AS q, ...).

Rolf