dedlfix: SQL: IF funktioniert nicht

Beitrag lesen

Hi!

Variante 1:

Die Abfrage bleibt wie sie jetzt ist, das IF() kann aber zugunsten des categoryname raus. Die abfragende Logik (die PHP-Funktion, die das SQL-Statement absendet und die Ergebnismenge entgegennimmt) stellt fest, wenn die Ergebnismenge leer ist (keine Kinder), soll sie die ID des Vorfahren zurückliefern. Die müsste sie eigentlich schon haben, denn zu genau diesem Vorfahren soll sie ja eigentlich die Kinder liefern.

Geringer Aufwand, kleine Änderung der Abfragelogik

Klingt ja als am sinnvollsten.
Nur heißt das - zwei Queries oder?

Nein, das wäre Variante 3 gewesen.

Ich schicke also den hier ab:

SELECT

IF(node2.lft+1!=node2.rgt, node1.categoryname, node2.categoryid) AS res
FROM board_category AS node1
LEFT JOIN board_category AS node2 ON node2.categoryname='Paul Watzlawick'
WHERE
node1.lft BETWEEN node2.lft AND node2.rgt
AND node1.level = node2.level+1

  
Das IF() kann - wie bereits gesagt - raus. Es trifft nie zu, weil das Vorfahr-Element auf dass es passen könnte, kein Ergebnismengenbestandteil wird. Dazu muss man wissen, in welcher Reihenfolge die SQL-Klauseln ausgewertet werden (jeweils, wenn vorhanden):  
  
- FROM und JOIN holen die sich die zu verarbeitenden Tabellen. Die JOIN-Bedingung filtert bereits erste Datensätze raus.  
- WHERE filtert anschließend weitere Datensätze weg.  
- GROUP BY ist nun an der Reihe und gruppiert die Ergebnismenge.  
- Nun erst kommt SELECT und berechnet die Spalten der Ergebnismenge.  
- HAVING filtert aus diesem Ergebnis weitere Reihen weg.  
- ORDER BY sortiert den Rest.  
- LIMIT kürzt zu guter Letzt auch noch weg.  
  
Diese Reihenfolge dient der groben Orientierung. Tatsächlich kann es durch den Optimierer des DBMS zu einer anderen Reihenfolge kommen, aber das ändert am Ergebnis nichts.  
  
Du solltest nun sehen, dass, wenn du mit WHERE keinen Vorfahr durchlässt, keine Berechnungen im SELECT damit angestellt werden können.  
  

> Und falls das Ergebnis leer ist, schicke ich diesen hinterher:  
> SELECT categoryid FROM board\_category WHERE categoryname='Paul Watzlawick'  
> Oder verstehe ich das falsch?  
  
Wie gesagt, das wäre Variante 3 gewesen. Nummer eins geht davon aus, dass dir die Kategorien-ID bereits bekannt ist. Woher hast du sonst den categoryname? Wenn du das bisher noch nicht machst, könntest du bei dessen Abfrage gleich die ID ermitteln, und sparst dir nun einen Aufwand.  
  

> Was wäre denn performanter? Auf die Geschwindigkeit am Ende kommt es mir an.  
  
Am performantesten sind die Dinge, die nicht durchgeführt werden müssen. Ob eine SP oder die Auswertung in PHP schneller ist, kann ich dir nicht sagen. Billiger als mit Variante 1 wirst du damit nicht kommen. Ich bin ja nach wie vor der Meinung, dass du die ID bereits vorliegen haben müsstest (den Namen bekommst du ja auch irgendwo her). Wenn das nicht der Fall ist, überleg doch noch mal, ob du sie nicht bereits in einem früheren, sowieso schon vorhandenen Schritt besorgen kannst. Das wäre aus meiner Sicht das Gescheiteste.  
  
  
Lo!