Operatoren Kombination AND NOT ?

Don Stefano

Erfahrenes Mitglied
Hallo zusammen,

ich habe ein seltsames Problem mit einer MySql Abfrage.

Die folgende Query stammt von einer Programmiererin, mit der ich zusammen arbeite. Sie funktioniert einwandfrei auf ihrem Entwicklungssystem, nicht aber auf meinem (XAMP) oder auf dem Server.

PHP:
 sql=mysql_query("SELECT * FROM tabelle WHERE 
text_id=".intval($text_id)." AND NOT text_reihenfolge=3 ORDER BY 
text_reihenfolge ASC");
Das Problem liegt darin, dass bei ihr mit dieser Abfrage korrekterweise 2 Datensätze (Felder) ausgelesen werden (diese haben die text_id 1 und 2). Bei mir und auf dem Server wird hingegen KEIN Datensatz ausgelesen (obwohl eigentlich 2 vorhanden sind, die ausgelesen werden sollten).

Die Programmiererin verwendet MySQL-Version: 5.0.15 + Bug #13783
Ich verwende MySql 4.1.10 und der Server 4.1.11.

Ich habe durch ausprobieren mit PHP-MyAdmin herausbekommen, dass das Problem an dem NOT bzw. an dem AND NOT liegt.

Unterstützen diese älteren Versionen die Kombination der Operatoren (AND NOT) nicht? Wie kann man es dann anders ausdrücken, so dass es funktioniert (und zwar mit verschiedenen MySql-Versionen)?

Ich kann mir nun zwar in diesem Fall behelfen indem ich anstatt
PHP:
WHERE .... AND NOT text_reihenfolge=3
folgendes schreibe:

PHP:
WHERE .... AND text_reihenfolge<3
Aber wenn es nun noch ID´s gäbe, die größer wären als 3 käme ich ja mit dieser Lösung auch nicht weiter (oder wenn ich mehrere Datensätze ausschließen möchte als nur "text_reihenfolge=3").

Wäre dann folgende Möglichkeit mit "!=" SQL kompatibler?

PHP:
sql=mysql_query("SELECT * FROM  tabelle  WHERE 
text_id=108 AND text_reihenfolge!=3 AND text_reihenfolge!=1 ORDER BY 
text_reihenfolge ASC");

Und wer kann mir sagen, was dieses ASC am Ende bewirkt?
 
!= ist SQL-Standard, genauso wie <>. Das Problem sehe ich allerdings nicht. Wenn Du die Datensätze nicht willst, bei denen text_reihenfolge ungleich 3 ist, dann schreib das doch auch so hin (siehe Deine letzte Query).

Das ASC bedeuted "ascending" (aufsteigend) und legt die Sortierreihenfolge fest. Die Ergebnismenge ist also aufsteigend (=beginnend mit der kleinsten Zahl) nach text_reihenfolge sortiert. Das Gegenstück dazu ist DESC ("descending").
 
Erst mal Danke für die Aufklärung über ASC und DESC!

Ich habe die Ursprungsquery ja nicht selbst geschrieben und wir haben ewig lange geräzelt, wieso bei mir immer die Ausgabe der beschriebenen 2 Datensätze ausblieb.

Ich wollte eigentlich wissen, ob es sein kann, dass die Verknüpfung von AND NOT mit neueren MySql Versionen funktioniert aber mit älteren nicht. Und ob es dafür dann noch eine andere (bessere?) Schreibweise gibt als das von mir vorgeschlagene ... AND text_reihenfolge !=3.

Aber zumindest funktioniert es so ja jetzt schon einmal.

Grazie!
 
Zurück