Mailinglisten-Archive |
>Also alle, die in A enthalten sind, in B überhaupt keine Entsprechung haben >(a_id=4) und alle diejenigen, die in A enthalten sind, in B aber keine >Entsprechung für B.bedingung=200 (a_id=1, a_id=3) haben. So gehts: mysql> SELECT DISTINCT A.a_id -> FROM A -> LEFT JOIN B ON A.a_id=B.a_id -> LEFT JOIN B AS C ON B.a_id=C.a_id AND C.bedingung='200' -> WHERE B.bedingung IS NULL OR C.bedingung IS NULL; +------+ | a_id | +------+ | 1 | | 3 | | 4 | +------+ 3 rows in set (0.00 sec) Das ist komplizierter als man anfangs denkt (zumindest als ich dachte). Man braucht -- im Nachhinein ist mir klar warum -- einen zweiten LEFT JOIN, weil man jeweils innerhalb jeden Satzes B.a_id prüfen muss, ob EINER bedingung=200 hat: B.a_id=C.a_id AND C.bedingung='200' :: "Füge die zusammen, die die selbe a_id haben und bedingung=200" --> das geht nicht bei denen, die wir haben wollen, dort kriegt man NULL: --snip-- mysql> SELECT * -> FROM B -> LEFT JOIN B AS C ON B.a_id=C.a_id AND C.bedingung='200'; +------+------+-----------+------+------+-----------+ | b_id | a_id | bedingung | b_id | a_id | bedingung | +------+------+-----------+------+------+-----------+ | 1 | 1 | 100 | NULL | NULL | NULL | | 2 | 1 | 300 | NULL | NULL | NULL | | 3 | 2 | 100 | 4 | 2 | 200 | | 4 | 2 | 200 | 4 | 2 | 200 | | 5 | 2 | 300 | 4 | 2 | 200 | | 6 | 3 | 100 | NULL | NULL | NULL | | 7 | 3 | 300 | NULL | NULL | NULL | +------+------+-----------+------+------+-----------+ 7 rows in set (0.00 sec) --snip-- Jetzt muss man diesen ganzen Satz mit einem LEFT JOIN über a_id mit A zusammenfügen. Das gibt dann: mysql> SELECT * -> FROM A -> LEFT JOIN B ON A.a_id=B.a_id -> LEFT JOIN B AS C ON B.a_id=C.a_id AND C.bedingung='200'; +------+------+------+------+-----------+------+------+-----------+ | a_id | name | b_id | a_id | bedingung | b_id | a_id | bedingung | +------+------+------+------+-----------+------+------+-----------+ | 1 | VA 1 | 1 | 1 | 100 | NULL | NULL | NULL | | 1 | VA 1 | 2 | 1 | 300 | NULL | NULL | NULL | | 2 | VA 2 | 3 | 2 | 100 | 4 | 2 | 200 | | 2 | VA 2 | 4 | 2 | 200 | 4 | 2 | 200 | | 2 | VA 2 | 5 | 2 | 300 | 4 | 2 | 200 | | 3 | VA 3 | 6 | 3 | 100 | NULL | NULL | NULL | | 3 | VA 3 | 7 | 3 | 300 | NULL | NULL | NULL | | 4 | VA 4 | NULL | NULL | NULL | NULL | NULL | NULL | +------+------+------+------+-----------+------+------+-----------+ 8 rows in set (0.00 sec) Die gesuchten DS sind jetzt die, die ENTWEDER im B- oder im C-Teil Nullen haben, weil sie einer Prüfung nicht standgehalten haben. Die kann ich jetzt mit "WHERE B.bedingung IS NULL OR C.bedingung" raussuchen. Wenn man die einzelnen a_id sucht nimmt man noch DISTINCT dazu. Und ZACK! Die Lösung ist also: SELECT DISTINCT A.a_id FROM A LEFT JOIN B ON A.a_id=B.a_id LEFT JOIN B AS C ON B.a_id=C.a_id AND C.bedingung='200' WHERE B.bedingung IS NULL OR C.bedingung IS NULL; Gruss, schönen Sonntag abend noch, -Florian -- Caspar Florian Ebeling <cfe_(at)_plannersdelight.net> / http://www.plannersdelight.net/ Boeblinger Str 63, 70199 Stuttgart, Tel +49 (0) 711 60 70 142 --- *** Weitere Infos zur Mailingliste und MySQL unter www.4t2.com/mysql
php::bar PHP Wiki - Listenarchive