MySQL ignoriert das "!=" (ungleich) - verstehe die Welt nicht mehr

webix

Mitglied
Hallo,

ich komme hier nicht weiter, vielleicht stehe ich auf dem Schlauch :)

Folgendes Problem. Hab zwei Tabellen.

car
id, kennzeichen
1, f-230
2, ab-23
3, b-ba-230
4, m-a-300
5, kb-a-300

car_user_come
id_user, id_car
1, 2
1, 3

Ich will mir alle car.kennzeichen ausgeben, die nicht mit id_car in car_user_come verzeichnet sind:

SELECT car.kennzeichen AS kennzeichen, car.id AS id
FROM car, car_user_come
WHERE car.id != car_user_come.id_car
GROUP BY car.id

MySQL ignoriert aber meine Anfrage und gibt alle Kennzeichen aus. Wenn ich die WHERE Bedingung gleichsetze car.id = car_user_come.id_car gibt MySQL die ersten beiden Kennzeichen mit der id 2 und 3 aus, aber die Ausklammerung dieser klappt nicht.

Weiß vielleicht jemand von Euch woran es liegen kann?
 
Hallo webix,

du bildest hier ein Kreuzprodukt aus den beiden Tabellen. Lass mal die Gruppierung und die Where-Klausel weg und selektiere alle Spalten, dann siehst du was das bedeutet. Deine Abfrage lässt sich beispielsweise über ein Subquery realisieren:

SQL:
SELECT car.kennzeichen AS kennzeichen, car.id AS id
FROM car 
WHERE car.id NOT IN (SELECT DISTINCT car_user_come.id_car FROM car_user_come)

Grüße, Matthias
 
Hallo Matthias,

vielen Dank für die schnelle Hilfe. Die Lösung über eine Sub-Query ist sehr gut, allerdings verstehe ich immer noch nicht, woran es liegt, dass MySQL das != ignoriert, aber das = annimmt. Du sprichst von Kreuzprodukten, aber ich verknüpfe die ja auch "korrekt"?
 
vielen Dank für die schnelle Hilfe. Die Lösung über eine Sub-Query ist sehr gut, allerdings verstehe ich immer noch nicht, woran es liegt, dass MySQL das != ignoriert, aber das = annimmt. Du sprichst von Kreuzprodukten, aber ich verknüpfe die ja auch "korrekt"?
MySQL geht bei deiner Abfrage (rein von der Logik her) folgendermaßen vor:

Selektiere alle Kombinationen von Einträgen aus den beiden Tabellen (das ist das Kreuzprodukt, auch kartesisches Produkt genannt). Zwischenergebnis:
Code:
+----+-------------+---------+--------+
| id | kennzeichen | id_user | id_car |
+----+-------------+---------+--------+
|  1 |       f-230 |       1 |      2 |
|  1 |       f-230 |       1 |      3 |
|  2 |       ab-23 |       1 |      2 |
|  2 |       ab-23 |       1 |      3 |
|  3 |    b-ba-230 |       1 |      2 |
|  3 |    b-ba-230 |       1 |      3 |
|  4 |     m-a-300 |       1 |      2 |
|  4 |     m-a-300 |       1 |      3 |
|  5 |    kb-a-300 |       1 |      2 |
|  5 |    kb-a-300 |       1 |      3 |
+----+-------------+---------+--------+
Beschränke das Ergebnis auf die Zeilen, für die die Bedingung der Where-Klausel erfüllt ist:
Code:
+----+-------------+---------+--------+
| id | kennzeichen | id_user | id_car |
+----+-------------+---------+--------+
|  1 |       f-230 |       1 |      2 |
|  1 |       f-230 |       1 |      3 |
|  2 |       ab-23 |       1 |      3 |
|  3 |    b-ba-230 |       1 |      2 |
|  4 |     m-a-300 |       1 |      2 |
|  4 |     m-a-300 |       1 |      3 |
|  5 |    kb-a-300 |       1 |      2 |
|  5 |    kb-a-300 |       1 |      3 |
+----+-------------+---------+--------+
Gruppiere nach id und selektiere die gewünschten Spalten:
Code:
+----+-------------+
| id | kennzeichen |
+----+-------------+
|  1 |       f-230 |
|  2 |       ab-23 |
|  3 |    b-ba-230 |
|  4 |     m-a-300 |
|  5 |    kb-a-300 |
+----+-------------+
So klarer geworden?

Grüße, Matthias
 
Zurück