hallo zusammen,
ich hab folgendes problem mit einer Abfrage in einer n:m Beziehung (Zuordnungstabelle):
Beispiel-Tabellen als GIF:
tabellen
Eigentlich ist das ganze komplexer, da es noch Bände und Ausgaben gibt. Aber das eigentliche Problem kann man auf die Bücher runterbrechen:
Es gibt Bücher, welche Objekte enthalten. Dabei können die unterschiedlichen Bücher auch die gleichen Objekte enthalten. Angenommen es gibt nur zwei Bücher (eigentlich Issues(Ausgaben))!
Ich brauche für einen Filter eine Abfrage die mir ausgibt welche Objekte NICHT in Buch ID:1 sind. d.h:
- alle die gar keine Zuordnung haben (nicht in der book_contains object auftauchen)
- alle die in Buch ID:2 sind aber nicht gleichzeitig auch in Buch ID:1
Im Beispiel sind das die Objekte: 7, 17
Meine Abfrage funktioniert, bin mir aber nicht sicher ob man das evtl. viel einfacher lösen kann. Das ganze wird in einer Ajax-Anwendung angewandt und ist aufgrund der großen Datenmenge in der DB nicht ganz so fix:
Code:
SELECT o.id, o.title FROM object AS o
LEFT JOIN book_contains_object AS bco ON bco.object_id = o.id
WHERE o.[andere Bedingung] AND (bco.book_id = '2' OR bco.book_id IS NULL)
AND o.id NOT IN
(
SELECT o.id FROM object AS o
INNER JOIN book_contains_object AS bco ON bco.object_id = o.id
WHERE o.[andere Bedingung] AND bco.book_id = '1'
)
nicht in Buch ID:1 ist in dem Fall das selbe wie: alle aus Buch ID:2 (-> weil es nur zwei Bücher gibt).
Mit der Sub-Select hole ich mir die ids von allen Objekten die in Buch ID:1 sind und
schließe die in der außeren Abfrage aus.
geht das nicht einfacher? oder kann man das nur so machen????
habe folgenden Ansatz von jemand bekommen:
Code:
SELECT * FROM book_contains_object b1
LEFT JOIN book_contains_object b2
ON b1.object_id = b2.object_id
AND b1.book_id <> b2.book_id;
...also die Zuordnungstabelle mit sich selbst verknüpfen,
aber das haut so auch nicht hin...
i werd narrisch!
bin für jeden hinweis dankbar
joerg