Ilja: Bekomme Abfrage nicht hin

Beitrag lesen

moin,

Das liefert mir aber zuviel Ergebnisse.
Hat jemand einen Vorschlag?

ergänzend zu dem, was dir Ekki und rommy gesagt haben, will ich dich auf eine andere problematik hinweisen, "joins sind böse". natürlich sind sie das nicht wirklich, aber man sollte sich diesen grundsatz merken, da er genau bei dem problem hilft, welches du gerade hast. in rdbms werden die jeweiligen informationen auf die verschiedenen tabellen aufgeteilt. benötige ich eine bestimmte abfrage, so muss ich mir alle tabellen zusammensuchen, die bezüglich der abfrage relevante informationen enthalten. die meisten würden das eben über joins machen. joins sind aber nicht die einzige möglichkeit tabellen miteinander in verbindung zu bringen. man muss schon mit bedacht entscheiden, wann man was einsetzt.

es gibt unterschiedliche beziehungstypen zwischen den tabellen, man spricht hier von 1:1, 1:n oder auch n:m beziehungen, die entsprechend über die jeweiligen tabellen abgebildet werden. so hast du aller wahrschenlichkeit nach zwischen den tabellen bucher & bücherstapel (noch ein tipp, vermeide buchstaben wie ü in objektnamen) eben eine solche n:m beziehnug. ausgesprochen sagt man, ein buch kann in mehrere stapeln sein, ein stapel kann mehrere bücher haben. das macht mich ein wenig stutzig, weil ein buch sollte eigentlich nicht in verschiedenen stapeln auftauschen, aber das hängt stark davon ab, was genau du damit abbildest. muss man noch mal schauen.

wie auch immer, für deine problematik ist das erst mal egal. wenn wir nun eine solche n:m beziehung haben, dann verfielfachen sich durch die verwendung der joins die datensätze bei einer abfrage. um dies zu vermeiden rate ich immer, erst mal die richtige basis (anzahl) der datensätze aufzubauen. in deinem falle willst du alle bücher haben, das wäre dann auch deine "basistabelle".

SELECT COUNT(*)
FROM bucher
;

nun kommt die spannende frage, wie schließe ich die bücher aus, die ich nicht haben will, ohne joins zu verwenden. die antwort darauf sind sogenannte korrelierte unterabfragen. ob man diese verwenden kann, hängt ein wenig von deinem dbms und der version ab, ich vermute mal, du benutzt mysql, fragt sich nur noch in welcher version ? zumal auch noch nicht ganz klar ist, was die spalte "jgst" darstellt und warum sie in zwei tabellen vorkommt und wie die drei tabellen miteinander verbunden sind, ich kann also nur vermuten.

SELECT COUNT(*)
FROM bucher b
WHERE b.jgst = hier_ein_bestimmer_wert
AND NOT EXISTS (SELECT NULL
                FROM buch_in_stapel bis
                WHERE bis.buchid b.id
                AND stapelid = 1
               )
;

Ilja