Hi
Hallo liebes Forum,
seit Stunden quält mich eine Query die einfach nicht das ausspuckt was sie soll. Vielleicht kann einer von euch weiterhelfen.
Keine Sorgen
Etwas vereinfacht:
Tabelle "Dinger" (id, name, ding_art, sachen_count)
Tabelle "Sachen" (id, name)
Tabelle "Dinger_Sachen" (ding_id, sache_id)Leicht zu erkennen: Ein Ding ist von einer ding_art und kann mehrere Sachen haben (Zwecks Optimierung wird die Anzahl der Sachen in sachen_count mitgespeichert).
Eigentlich brauchst du sachen_count gar nicht, denn mit den richtigen Datentypen und richtigen Abfragen geht es im SQL sauschnell, es sei denn deine Datensätze bewegen sich 5-stellig und aufwärts....
Meine Anfrage: "Zu einer Menge von 'Sachen' gib mir alle 'Dinger' einer 'ding_art' die _mindestens_ _alle_ diese 'Sachen' haben"
Mein Ansatz bisher:
SELECT * FROM Dinger d
WHERE d.ding_art='tolles-ding'
AND d.sachen_count =
(SELECT COUNT(ds.sache_id) FROM Dinger_Sachen ds
WHERE ds.ding_id = d.id
AND ds.sache_id IN ("ids der geforderten Sachen")
GROUP BY ds.sache_id
HAVING COUNT(ds.sache_id) = d.sachen_count)Naja, es spuckt einfach irgendwie nur die Dinger aus die nur eine Sache haben. Ich hab natürlich alle möglichen Variationen dieses Ansatzes probiert, wahrscheinlich ist er von Grund auf falsch...
Hab aufn Notebook leider keine Datenbank aber ich glaube du suchst nach JOIN. Es gibt 3 Typen: LEFT JOIN, INNER JOIN, RIGHT JOIN
LEFT JOIN:
select DING.ID_DING, DING.NAME, SACHEN.NAME
from DINGE
left join SACHEN on DINGE.ID_DING = SACHEN.ID_DING
spuckt alles aus, was einzig in DINGE ist und mehrfach in SACHEN sein kann. Es MUSS in Dinge vorkommen, aber KANN in SACHEN vorkommen.
INNER JOIN:
select DING.ID_DING, DING.NAME, SACHEN.NAME
from DINGE
inner join SACHEN on DINGE.ID_DING = SACHEN.ID_DING
spuckt alles aus, was in DINGE ist UND in SACHEN sein muss. Es MUSS in beiden Tabellen vorkommen, keine NULL-Werte.
RIGHT JOIN:
select DING.ID_DING, DING.NAME, SACHEN.NAME
from DINGE
inner join SACHEN on DINGE.ID_DING = SACHEN.ID_DING
spuckt alles aus, was in DINGE sein kann, aber in SACHEN sein muss. Wird am seltensten verwendet.
Stell es dir wie 2 Exceltabellen nebeneinander vor. Die linke Tabelle wird in der from-Kausel bestimmt (from DINGE).
Die rechte in der JOIN (join SACHEN).
LEFT JOIN: muss links vorkommen
INNER JOIN: muss in beiden vorkommen
RIGHT JOIN: muss rechts vorkommen
(OUTER JOIN): darf in beiden vorkommen (links-null + rechts-null erlaubt) <-- hab ich grad vergessen!
Vieleicht weiß jemand von euch weiter... ?
Grüße Heinz
Informier dich über die JOIN, damit kannst du alles regeln. Währenddessen schau ich mir deinen Code genauer an.
mfg Kadir