![]() |
Datenbank: ABS • Version: 5.13 • Zugriff über: ABS Komponenten
Schwierige SQL-Abfrage, oder wie muss ich joinen (left...)?
Ok, die Überschrift ist nicht prickelnd..
Nun mein Problem Ich habe drei Tabellen: WORDS --------------------- WORD_ID INTEGER WORD VARCHAR 1 der 2 eine 3 niemand 4 peter DOCUMENT_WORDS --------------------- DOCUMENT_WORD_ID INTEGER WORD_ID INTEGER DOCUMENT_ID INTEGER 1 1 1 2 3 1 3 4 1 4 2 2 4 1 2 DOCUMENTS --------------------- DOCUMENT_ID INTEGER DOCUMENT_NAME VARCHAR 1 Diplom1.doc 2 Putzplan.doc 3 Tagebuuch.doc Wie muss ich jetzt meine Select-Anweisung formulieren, um die Dokumente anzeigen zu lassen, in denen ALLE Wörter vorkommen, die meiner Suchanfrage entsprechen? Als Beispiel will ich jetzt die Dokumente aufgelistet haben, in denen die Wörter "der" und "eine" vorkommen. Richtig gut wäre es, wenn ich hier noch formulieren könnte, welche Wörter NICHT in einem Dokument enthalten sein dürfen. Ich breche mir hier mit den ganzen left inner... Join-Möglichkeiten die Finger ab, und komme zu keinem vernünftigen Ergebnis. Moin |
Re: Schwierige SQL-Abfrage, oder wie muss ich joinen (left..
Hallo,
select distinct(DOCUMENT_NAME ) from DOCUMENTS join DOCUMENT_WORDS.DOCUMENT_ID = DOCUMENTS.DOCUMENT_ID join WORDS on WORDS.WORD.ID= DOCUMENT_WORDS.WORD_ID where (WORDS.WORD='der') or (WORDS.WORD='eine') zum nicht vorhanden würde ich nen subselect nehmen siehe meine Posting heute zu "delete mit join" Heiko |
Re: Schwierige SQL-Abfrage, oder wie muss ich joinen (left..
Tja, die Suche ist auf jeden Fall gelöst:
SQL-Code:
Jetzt fehlt nur noch die Ausschlussbedingung.
select d.document_name, d.document_id, w.word
from documents as d, document_words as dw left join words as w on dw.word_id=w.word_id where d.document_id=dw.document_id and (w.word='der' or w.word='eine') |
Re: Schwierige SQL-Abfrage, oder wie muss ich joinen (left..
Hallo stifflersmom,
hier mal mein Vorschlag...
SQL-Code:
Gruss
SELECT d.document_name, d.document_id, w.word
FROM documents d INNER JOIN document_words dw ON d.document_id = dw.document_id LEFT JOIN words w ON dw.word_id = w.word_id WHERE w.word IN ('der', 'eine') AND w.word NOT IN ('die', 'das') Thorsten |
Re: Schwierige SQL-Abfrage, oder wie muss ich joinen (left..
Zitat:
|
Re: Schwierige SQL-Abfrage, oder wie muss ich joinen (left..
Aufbauend auf dem Vorschlag oben:
SQL-Code:
SELECT d.document_name, d.document_id, w.word
FROM documents d INNER JOIN document_words dw ON d.document_id = dw.document_id LEFT JOIN words w ON dw.word_id = w.word_id WHERE w.word IN ('der', 'eine') AND dw.word_id NOT IN (SELECT word_id FROM words WHERE word IN ('die', 'das')) |
Re: Schwierige SQL-Abfrage, oder wie muss ich joinen (left..
SQL-Code:
das muss eigentlich gehen :gruebel:
SELECT d.document_name, d.document_id, w.word
FROM documents d INNER JOIN document_words dw ON d.document_id = dw.document_id LEFT JOIN words w ON dw.word_id = w.word_id WHERE (w.word IN ('der', 'eine')) AND NOT (w.word IN ('die', 'das')) |
Re: Schwierige SQL-Abfrage, oder wie muss ich joinen (left..
Zitat:
|
Re: Schwierige SQL-Abfrage, oder wie muss ich joinen (left..
es kommen doch sicher Fehlermeldungen wenn du die Abfragen ausführst, kannst du die mal dazuposten wenn was nciht funktioniert?
|
Re: Schwierige SQL-Abfrage, oder wie muss ich joinen (left..
Zitat:
denn es wedren alle Dokumente gefunden in denen entweder das eine oder das andere Wort vorkommt, nicht aber das was eigentlich soll, nämlich das, in dem beide Wörter zu finden sind. |
Re: Schwierige SQL-Abfrage, oder wie muss ich joinen (left..
Zitat:
nur das Ergebnis ist nicht so wie gewünscht. |
Re: Schwierige SQL-Abfrage, oder wie muss ich joinen (left..
dann mach doch mal aus dem OR ein AND...
und dann noch meine Ausschlussbedingung dazu, das sollte dann passen. |
Re: Schwierige SQL-Abfrage, oder wie muss ich joinen (left..
Zitat:
|
Re: Schwierige SQL-Abfrage, oder wie muss ich joinen (left..
Zitat:
mache ich aus dem OR ein AND, dann kommt gar kein Ergebnis mehr raus. Jedenfalls nicht mit den Abfragen, wie sie bis jetzt hier stehen. |
Re: Schwierige SQL-Abfrage, oder wie muss ich joinen (left..
Erster Gedanke (keinen Schimmer, ob die Laufzeit erträglich ist)
SQL-Code:
Die Zahl muss halt gleich der Anzahl der gesuchten Worte sein. Die Query gibt alle gefunden Kombinationen zurück und das having schmeißt alle Dokumente raus, die nur einen Teil der Wörter enthalten.
select d.document_name, d.document_id
from documents as d join document_words as dw on d.document_id = dw.document_id join words join words as w on dw.word_id = w.word_id where w.word='der' or w.word='eine' group by d.document_name, d.document_id having count(*) = 2 |
Re: Schwierige SQL-Abfrage, oder wie muss ich joinen (left..
SQL-Code:
so vielleicht?select d.document_name, d.document_id from documents as d where (select count(*) from document_words as dw left outer join words as w on dw.word_id=w.word_id where (d.document_id=dw.document_id)and(w.word="der" or w.word="eine"))>="2" ich gehe dabei davon aus das nich zweimal das Wort "eine" bei document 1 ist, sondern jedes Wort pro Dokument nur einmal aufgeführt wird |
Re: Schwierige SQL-Abfrage, oder wie muss ich joinen (left..
Zitat:
aber funktioniert soweit, fehlt nur noch die Ausschlussbedingung zu meinem Glück |
Re: Schwierige SQL-Abfrage, oder wie muss ich joinen (left..
Zitat:
Allerdings fehlt auch hier zu meinem vollkommenen Glück, die Ausschlussbedingung. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:48 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz