Selim: Schnittmenge zweier Tabellen

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.

  1. 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

    1. 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

      1. 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

        1. 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

          1. 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

            1. 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