Schnittmenge zweier Tabellen
Selim
- datenbank
Ich habe zwei Tabellen: Tab_gesucht und Tab_angeboten. Beide
haben eine ID die zu einem Produkt führen (produkt_id).
Ich möchte gerene aus beiden Tabellen die Schnittmenge
erzeugen, so dass ich z.B. für einen bestimmten Kunden (kunden_id
aus anderer Kundentabelle) herausfinden kann, welche anderen
Kunden das anbieten was er sucht.
Im anderen Falle geht es umgekehrt: Es werden alle Kunden
ausgegeben, welche das suchen was der spezifizierte Kunde
anbietet.
yo,
da relationale datenbanken die mengenlehre in sich "tragen", bieten die dbms in aller regel auch mengen-operatoren an. intersect würde zum beispiel für die schnittmenge stehen.
auf der anderen seite läßt es sich auch einfach mit INNER JOINS über die Produkt-ID (join bedingung über den fremdschlüssel) lösen.
Ilja
Hallo Ilja,
mit Joins habe ich bisher noch nicht gerabeitet (bzw. nicht mit solchen
Queries wo an irgendeiner Stelle JOIN steht). Meine
Abfrage
sieht so aus:
SELECT * FROM my_produkte WHERE id IN (SELECT my_produkte_angebot.produkt_id FROM my_produkte_gesuch, my_produkte_angebot WHERE my_produkte_gesuch.word_id = my_produkte_angebot.word_id GROUP BY my_produkte_gesuch.produkt_id)
Ist das jetzt eigentlich schon ein (also im Subselect) Join?
Jede Hilfe herzlich willkommen,
Selim
yo,
innerhalb der unterabfrage befindet sich schon ein INNER JOIN, auch wenn die schreibweise es nicht so direkt hervor gibt. deswegen rate ich immer dazu, die explizite schreibweise zu benutzen, macht es einfacher, die abfrage zu lesen. die GROUP BY klausel ist übrigens überflüssig, bzw. ich würde falls überhaupt doppelte werte vorkommen dann besser DISTINCT verwenden.
eine unterabfrage kann man grundsätzlich auch verwenden, ich würde hier aber einen JOIN benutzen. ich habe mal deine abfrage ein wenig umgebaut, wobei ich mir noch nicht ganz klar bin, was genau die 3 tabellen darstellen.
SELECT spalte1, spalte2 ....
FROM my_produkte t1
INNER JOIN my_produkte_angebot t2 ON t1.id = t2.produkt_id
INNER JOIN my_produkte_gesuch t3 ON t2.word_id = t3.word_id
;
Ilja
Hallo Ilja,
also, folgendermassen:
Es gibt eine Suche für einen angemeldeten Kunden (Tab.: my_kunden).
Dann gibt es Angebote (Tab.: my_produkte_angebot) und Gesuche (Tab.: my_produkte_gesuche). Ausserdem, und das hatte ich noch vergessen,
gibt es eine vierte Tabelle die als Suchwortindex (Tab.: my_suchwortindex) dient, so dass z.B.
mehrere Wörter pro angebotenem/gesuchtem Produkt verglichen werden müssen.
Sucht besipielsweise ein Kunde Blumen oder Sträuße, dann werden
alle anderen Kunden gefunden, die eines der Suchwörter enthalten.
my_kunden
id
vorname
nachname
my_produkte_angebot
id
word_id
produkt_id
my_produkte_gesuche
id
word_id
produkt_id
my_suchwortindex
id
wort
Natürlich gibts noch eine fünfte Tabelle, wo alle Produktdetails wie Preise u.ä. drin stehen.
Ich brauche jetzt eine Abfrage die, sucht ...
... alle Kunden die bieten was ich suche ... und ...
... alle Kunden die suchen was ich biete ...
Wie könnte so eine Abfrage aussehen?
Für Hilfe wäre ich echt sehr dankbar.
Herzlich,
Selim
yo,
wenn ich nichts übersehen habe, fehlt da noch in den beiden tabellen my_produkte_angebot und my_produkte_gesuche die spalte, die den fremdschlüssel aus der tabelle my_kunden enthält. ich nehme dazu einfach mal eine spalte mit einem von mir "erfundenen" namen.
... alle Kunden die bieten was ich suche ...
SELECT spalte1, spalte2...
FROM my_kunden t1
INNER JOIN my_produkte_gesuch t2 ON t2.my_kunden_id = t1.id
INNER JOIN my_produkte_angebot t3 ON t3.produkt_id = t2.produkt_id
WHERE t1.id = 'hier_wert_von_angemeldeten_kunden'
;
... alle Kunden die suchen was ich biete ...
SELECT spalte1, spalte2...
FROM my_kunden t1
INNER JOIN my_produkte_angebot t2 ON t2.my_kunden_id = t1.id
INNER JOIN my_produkte_gesuche t3 ON t3.produkt_id = t2.produkt_id
WHERE t1.id = 'hier_wert_von_angemeldeten_kunden'
;
die beiden abfragen lassen sich entsprechend der anderen tabellen erweitern, zum beispiel wenn man die details der produkte_tabelle hinzufügen will
Ilja
Hallo Ilja!
... alle Kunden die bieten was ich suche ...
SELECT spalte1, spalte2...
FROM my_kunden t1
INNER JOIN my_produkte_gesuch t2 ON t2.my_kunden_id = t1.id
INNER JOIN my_produkte_angebot t3 ON t3.produkt_id = t2.produkt_id
WHERE t1.id = 'hier_wert_von_angemeldeten_kunden'
;... alle Kunden die suchen was ich biete ...
SELECT spalte1, spalte2...
FROM my_kunden t1
INNER JOIN my_produkte_angebot t2 ON t2.my_kunden_id = t1.id
INNER JOIN my_produkte_gesuche t3 ON t3.produkt_id = t2.produkt_id
WHERE t1.id = 'hier_wert_von_angemeldeten_kunden'
;
Das ist schonmal ganz gut - natürlich vielen Dank, dass Du Dir
die Mühe gemacht hast. Allerdings ist die Sache so:
Ein Produktgesuch hat eine Beschreibung wie z.B. "Scheibenwischer mit
Gummi und Stahl". So, und dieser Satz wird zerhexelt in "Scheibenwischer", "Gummi", "Stahl". Ein anderer Kunde hat
ein Angebot für ein Produkt, z.B. "Resteverwertung von Gummi, Plastik und Stahl", welches in der DB-Tabelle my_suchwortindex ebenfalls
als "Resteverwertung", "Gummi", "Plastik", "Stahl" gespeichert
wird.
Also sowohl die Begriffe aus den Gesuchen, wie die Begriffe aus den
Angeboten landen beide in der my_suchwortindex-Tabelle. Die
word_id stehen dann in den Tabellen my_produkte_gesuche und my_produkte_angebot (u.a. eben auch mehrmals, da bestimmte Wörter in verschiendenen Produktgesuchen-/angeboten stehen).
Jetzt soll in der Querie eben verglichen werden wo sich, bzw. bei
welchen Produkt-Angeboten/-Gesuchen sich diese word_ids decken und
somit dann herausfinden wer was sucht was ich (bzw. der Kunde) anbiete und umgekehrt. Die Abfrage welche Kundejn ist eigentlich
sekundär.
Mir geht es viel wichtiger darum, bei welchen produkt_ids
Überschneidungen der word_ids auftreten (also innerhalb der Tabs:
my_produkte_angebot und my_produkte_gesuche).
Wenn Du mir hier nochmal helfen könntest wäre ich Dir sehr dankbar!
Herzlich,
Selim