Warum funzt dieser Query nicht?

Hallo zusammen!
Ich habe hier einen Query der mir aus einer Tabelle die aktuellsten Datensätze rausholt. Der Funktioniert prima, aber jetzt will ich etwas hinzufügen und das funzt irgendwie überhaupt nicht wie erwartet.

Also ich fang mal an, mit kommentaren im query

SELECT
 SQL\_CALC\_FOUND\_ROWS 
 t1.current\_year, -- Datensätze können jedes Jahr aktualisiert werden
 t1.pl\_id, -- Das ist die ID die jeder Datensatz über alle Jahre behält
 t1.name, -- Der Name des Eintrags
 e.name, -- Der Name des Editors, also demjenigen der diesem Datensatz zugeordnet ist und ihn bearbeiten darf
 e.role -- Die "Rolle" des Editors, das Feld ist ein enum('client', 'extern\_user', 'intern\_user', 'extern\_manager', 'intern\_manager', 'admin')
FROM
 data AS t1 
LEFT OUTER JOIN editor\_pl\_ids AS t\_e\_c ON t1.pl\_id = t\_e\_c.pl\_id -- wir holen die Zuordnung der Editoren zu den Datensätzen. Hier kann es nun passieren das es für einen Datensatz zwei Editoren gibt. Einmal mit der Rolle "Client" und einmal mit z.B. "intern\_user"
LEFT OUTER JOIN editors AS e ON e.uid = t\_e\_c.editor\_id -- Holen wie der Editor überhaupt heißt und welche Rolle er hat
WHERE
 intern\_geloescht != 'ja' -- So werden Datensätze als gelöscht markiert
 AND current\_year = 
 ( -- Dieser Subselect wirft alle Datensätze raus, die nicht im aktuellsten Jahr sind, weil nicht garantiert ist das jeder Datensatz jedes Jahr aktualisiert wird.
 SELECT
 MAX(current\_year)
 FROM
 data AS t2
 WHERE
 t1.pl\_id = t2.pl\_id
 ) 
-- so hier kommt der Knackpunkt! Ohne das AND role != 'client' funzt der Query gut, außer das Natürlich jeder Datensatz so oft im Ergebnis auftaucht wie es Einträge dazu im Table editor\_pl\_ids gibt. Und genau das will ich verhindern, denn alle Editoren mit der Rolle "Client" sind unwichtig.
-- Das Problem ist, das jeder Versuch mit AND role IS NOT LIKE 'client' oder AND e.role 1 zu einem leeren Ergebnis führt! Warum???
-- das einzige das zu sinnvollen, aber nutzlosen, Ergebnissen führt ist:
 AND role IS NULL

ORDER BY
 pl\_id
LIMIT
 1000, 25

So ich will jetzt also statt dem „AND role IS NULL“ eigentlich ein „AND role != ‚client‘“ haben, aber das führt eben zu einem leeren Ergebnis, obwohl doch zumindest mal die Datensätze auftauchen müßten, wo role leer ist, weil es in editor_pl_ids keinen Eintrag dazu gibt, oder?

Zur Arbeitsumgebung: die Entwicklermaschine läuft auf MySQL 5.0.33 (Windoze), das wo es dann mal laufen sollte bisher MySQL 4.1.irgendwas, kann aber auch auf 5.0 umsteigen.

Ich bin über jeden Rat dankbar.

Grüße
A. Hofmann

Mahlzeit,

ich habe mir das Ganze nicht allzu genau angeschaut, aber das läßt mich aufhorchen:

So ich will jetzt also statt dem „AND role IS NULL“ eigentlich
ein „AND role != ‚client‘“ haben, aber das führt eben zu einem
leeren Ergebnis, obwohl doch zumindest mal die Datensätze
auftauchen müßten, wo role leer ist, weil es in editor_pl_ids
keinen Eintrag dazu gibt, oder?

Genau - oder :smile:
NULL-Datensätze lassen keinen Vergleich zu. Das heißt, die Bedingung „AND role != ‚client‘“ beinhaltet implizit, daß die role NOT NULL ist:

AND role IS NOT NULL
AND role != ‚client‘

Wenn Du was anderes willst, mußt DU das explizit angeben:

AND ((role IS NULL) OR (role != ‚client‘))

HTH

Sancho

NULL-Datensätze lassen keinen Vergleich zu. Das heißt, die
Bedingung „AND role != ‚client‘“ beinhaltet implizit, daß die
role NOT NULL ist:

AND role IS NOT NULL
AND role != ‚client‘

Wenn Du was anderes willst, mußt DU das explizit angeben:

AND ((role IS NULL) OR (role != ‚client‘))

HTH

Sancho

Wow. Da wäre ich in 100 Jahren nicht drauf gekommen.
Vielen vielen Dank, du hast mir mehrere Stunden Frust erspart, dieser Hinweis kommt auf jeden Fall in mein Notizheft.

Viele Grüße
A. Hofmann