Tanelorn.net
Medien & Phantastik => Multimedia => Multimedia - Software & Betriebsysteme => Thema gestartet von: Fire am 10.01.2007 | 17:25
-
Hi...ich bin jetzt schon ein paar stunden an einer kleinigkeit...vielleicht gibts hier cracks, die mir das erklären können:
zuerst die aufgabe:
Um eine Benutzerin bei ihrer Literaturrecherche zu unterstützen sucht die
Bibliothekarin nach Büchern, die von der Geschichte der Evolutionsbiologie handeln (Bücher, die sowohl den Deskriptor „Wissenschaftsgeschichte”
als auch den Deskriptor „Evolutionsbiologie” besitzen).
dann meine schemata dazu (damit ihr wisst, wie meine tabellen aussehen (natürlich sind sie auch schon passend gefüllt)):
Buch: {[Buchnr: integer, Titel: string, ISBN: integer]}
Schlagwort: {[Schlagwortnr: integer, Name: string]}
BuchSchlagwortRel: {[Buchnr: integer, Schlagwortnr: integer]}
und (nicht ganz) mein entwurf dazu:
SELECT buch.titel FROM buch, schlagwort, buchschlagwortrel WHERE (schlagwort.name = "Wissenschaftsgeschichte" OR schlagwort.name = "Evolutionsbiologie") AND buchschlagwortrel.buchnr = buch.buchnr AND buchschlagwortrel.schlagwortnr = schlagwort.schlagwortnr;
is ja ganz nett...bringt auch das richtige ergebnis, ABER durch das OR ist ja eigentlich nur eins der beiden schlagwörter nötig! ich muss aber beide abfangen und finde da nicht das passende...union scheint es nicht zu sein und intersect auch nicht....
hat hier jemand nen plan?! is das einzige, was mir noch zu meiner hausarbeit für die uni fehlt! danach kann ich das ding sofort abgeben....plz help...ich bin am verzweifeln....
-
Kann mit deinem Schema gar nicht gehen.
Denn da kann jedes Buch ja nur ein Schlagwort haben.
Wie willst du da ein Buch finden das zwei Schlagworte besitzt?
-
Is doch N:M Beziehung...
In der BuchSchlagwortRel (das ist die Hilfstabelle) stehen die Bücher mit ihren jeweiligen Schlagwörtern drin.
Die Buchnr als auch die Schlagwortnr in BuchSchlagwortRel sind Fremdschlüssel zu jeweils den Primärschlüsseln in ihren eignen tabellen
Also kann z.B. ein Buch mehrere Schlagwörter haben
-
In der BuchSchlagwortRel kann es n:m Verbindungen geben.
Theoretisch kann man für exakt dieses Problem
SELECT buch.titel FROM buch, schlagwort sw1, schlagwort sw2, buchschlagwortrel WHERE (sw1.name = "Wissenschaftsgeschichte" and sw2.name = "Evolutionsbiologie") AND buchschlagwortrel.buchnr = buch.buchnr AND buchschlagwortrel.schlagwortnr = sw1.schlagwortnr AND buchschlagwortrel.schlagwortnr = sw2.schlagwortnr ;
Die echte Tabelle Schlagwort wird als SW1 und SW2 zweimal aufgerufen.
aber dann muss die Abfrage auch zwei Schlagworte suchen bzw die Tabelle diese enthalten. Praktisch etwas unsinnig.
-
Probier's mal hiermit:
SELECT titel FROM buch b WHERE
EXISTS
(SELECT * FROM schlagwort, buchschlagwortrel WHERE
schlagwort.name = "Evolutionsbiologie" AND
schlagwort.schlagwortnr = buchschlagwortrel.schlagwortnr AND
buchschlagwortrel.buchnr = b.buchnr)
AND EXISTS
(SELECT * FROM schlagwort, buchschlagwortrel WHERE
schlagwort.name = "Wissenschaftsgeschichte" AND
schlagwort.schlagwortnr = buchschlagwortrel.schlagwortnr AND
buchschlagwortrel.buchnr = b.buchnr)
Die beiden EXISTS-Blöcke sind im Prinzip gleich, nur dass sie eben auf die unterschiedlichen Schlagworte überprüfen.
Falls es funktioniert, erwarte ich entsprechende Opfergaben und eine angemessene Ehrerbietung! ;)
Ansonsten probier mal Marzans Vorschlag in folgender Abwandlung:
SELECT buch.titel FROM buch, schlagwort sw1, schlagwort sw2, buchschlagwortrel bwr1, buchschlagwortrel bwr2 WHERE (sw1.name = "Wissenschaftsgeschichte" and sw2.name = "Evolutionsbiologie") AND bwr1.buchnr = buch.buchnr AND bwr1.schlagwortnr = sw1.schlagwortnr
AND bwr2.buchnr = buch.buchnr AND bwr2.schlagwortnr = sw2.schlagwortnr;
-
Mich wundert, daß Ihr alle so fraglos davon ausgeht, daß die Schlagworte auch exakt so geschrieben werden.
Das kenne ich von "echten" Datenbanken leider nicht, daher würde ich anstelle von "=" lieber etwas in der Art empfehlen:
upper(sw1.name) like "%WISSENSCHAFTSGESCHICHTE%" and upper(sw2.name like "%EVOLUTIONSBIOLOGIE%"
-
Oh Grosser "DerCount"...du hast meinen Tag gerettet....auf die Lösung wäre ICH nie gekommen, aber so funktioniert es einwandfrei!!!
Opfergaben...hmmm....ich geb dir einen aus, wenn du mal auf einem Grossen bist ;)
Problem gelöst! Danke an alle, die mitgeholfen haben...Super Forum!!! :) Ihr seid toll
-
Genau die Art von Ehrerbietung meinte ich! ;D
Gern geschehen.
Sollten wir uns wirklich mal auf einem Grossen begegnen, komme ich auf Dein Angebot zurück.
:)
-
warum geht das nicht einfach so mit OR? ??? Oder gibt doch das Ergebniss zurück wenn mindestens eine Bedingung erfüllt ist. Oder funktioniert in SQL das OR als XOR?
-
Gewünscht sind ja Bücher, die zu BEIDEN Schlagworten passen.
Mit OR bekommst Du die zwar auch, aber zusätzlich noch diejenigen, die nur zu einem der beiden passen. Und wenn ich Fire richtig verstanden habe, will er genau die nicht dabei haben.
-
Genau...bei OR reicht auch eins der beiden schlagworte....es MÜSSEN aber beide schlagworte vorhanden sein...deswegen kein OR...
-
und warum dann nicht einfach AND statt OR ?
-
Weil sich dann die beiden schlagworte ausschliessen...ja ich weiss...macht keinen sinn...is aber so ;)
-
ok - danke für die Info :)