stewe: MySql Befehl: Differenzmenge zweier Mengen aus Datenbank?

Hallo zusammen

Ich habe nur wenig Kenntnisse bezügl. MySql-Befehle und suche eine Lösung für folgendes Problem:

Tabelle A enthält Informationen bezüglich in einer anderen Tabelle B enthaltener Begriffe. Ihr Aufbau:

Id: enthält die Id eines Eintrags
Begriffstext: Enthält einen einzigen Begriff der beim Eintrag mit der entsprechenden Id in Tabelle B enthalten ist

In Tabelle A gibt es jetzt x Einträge mit der gleichen Id und jeweils einem Wort in "Begriffstext".

(Den Aufbau der Datenbank kann ich nicht ändern, da für die Betreuung dieser eine andere Person zuständig ist)

Die Einträge in "Begriffstext" will ich jetzt benutzen, um zu in einer Suche eingegebenen Stichworten eine passende ID zu finden.
Dabei gibt es jetzt Wörter, die enthalten sein sollen (also WHERE Begriffstext='Wort') und andere, die nicht enthalten sein sollen (WHERE NOT Begriffstext='Wort'). Mein Problem ist jetzt, dass dies zwei unterschiedliche Mengen sind: wie kann ich die Abfrage kombinieren, wenn doch alle Einträge in unterschiedlichen Zeilen stehen und nur die ID die gleiche ist? Also ich bekomme eine Menge ID's wo das gesuchte Wort enthalten ist, und eine Menge von ID's, wo das nicht gewollte Wort enthalten ist und müsste jetzt Menge 2 von Menge 1 abziehen.
Geht das irgendwie in einem einzigen Mysql-Befehl?

Danke für eure Hilfe, hoffe ich habs verständlich erklärt!

gruss

  1. Hi,

    Dabei gibt es jetzt Wörter, die enthalten sein sollen (also WHERE Begriffstext='Wort') und andere, die nicht enthalten sein sollen (WHERE NOT Begriffstext='Wort').

    Und wie soll das Ergebnis der Suche aussehen, wenn zu einer ID sowohl ein gewünschter als auch ein nicht gewünschter Begriff gefunden werden?

    Mein Problem ist jetzt, dass dies zwei unterschiedliche Mengen sind: wie kann ich die Abfrage kombinieren, wenn doch alle Einträge in unterschiedlichen Zeilen stehen und nur die ID die gleiche ist? Also ich bekomme eine Menge ID's wo das gesuchte Wort enthalten ist, und eine Menge von ID's, wo das nicht gewollte Wort enthalten ist und müsste jetzt Menge 2 von Menge 1 abziehen.

    Du könntest die Zeilen, die in „Menge #1“ fallen, mit 1, und die in „Menge #2“ mit -1 gewichten, und dann über alle Datensätze pro ID die Summe bilden.
    IF bzw. CASE, und GROUP BY/SUM wären dazu die Stichworte.
    Diesen Wert könnte man dann bspw. mittels HAVING auswerten.

    MfG ChrisB

    --
    “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
    1. Und wie soll das Ergebnis der Suche aussehen, wenn zu einer ID sowohl ein gewünschter als auch ein nicht gewünschter Begriff gefunden werden?

      Dann soll die ID nicht im Ergebnis enthalten sein.

      Du könntest die Zeilen, die in „Menge #1“ fallen, mit 1, und die in „Menge #2“ mit -1 gewichten, und dann über alle Datensätze pro ID die Summe bilden.
      IF bzw. CASE, und GROUP BY/SUM wären dazu die Stichworte.
      Diesen Wert könnte man dann bspw. mittels HAVING auswerten.

      Das klingt interessant, ich muss mir diese Befehle genauer ansehen.
      Wird dies so in Bezug auf die Zeit die für die Abfrage benötigt wird effektiver sein, als wenn ich beispielsweise beide Mengen separat auslese und dann mit php Menge 2 von Menge 1 abziehe?

      gruss

      1. Hi,

        Wird dies so in Bezug auf die Zeit die für die Abfrage benötigt wird effektiver sein, als wenn ich beispielsweise beide Mengen separat auslese und dann mit php Menge 2 von Menge 1 abziehe?

        Pauschale Aussagen ohne genauere Rahmenbedingungen (bspw. Menge der Datensätze, Indices) sind zwar meist wenig wert - aber ich glaube nicht, dass die DB ein Problem damit haben wird, zusätzlich zu den WHERE-Bedingungen noch ein paar IF-/CASE-Vergleiche durchzuführen.

        MfG ChrisB

        --
        “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
        1. Pauschale Aussagen ohne genauere Rahmenbedingungen (bspw. Menge der Datensätze, Indices) sind zwar meist wenig wert - aber ich glaube nicht, dass die DB ein Problem damit haben wird, zusätzlich zu den WHERE-Bedingungen noch ein paar IF-/CASE-Vergleiche durchzuführen.

          In Ordnung, danke fürs Erste, werde mich bei Bedarf nochmals melden!

          gruss

    2. Du könntest die Zeilen, die in „Menge #1“ fallen, mit 1, und die in „Menge #2“ mit -1 gewichten, und dann über alle Datensätze pro ID die Summe bilden.
      IF bzw. CASE, und GROUP BY/SUM wären dazu die Stichworte.
      Diesen Wert könnte man dann bspw. mittels HAVING auswerten.

      Yay, danke Dir vielmals! Musste mich ziemlich in sql-Befehle einlesen, aber jetzt klappts! :)

      gruss

  2. Nochmals ein Frage zum gleichen Problem:

    Meine aktuelle Abfrage ist von dieser Form (geht das noch einfacher? -> die verschiedenen Summen sind nötig, da teilweise ein Begriff doppelt für eine Id angegeben ist, aber nur einmal zählen darf...):

    SELECT b.Id from begrifftabelle as b,medientabelle as m WHERE Medienart='Sachbuch' AND b.Id=m.Id AND b.Id NOT IN(SELECT Id FROM begriff WHERE Begriffstext='PHP') GROUP BY b.Id HAVING SUM(Begriffstext='MySql')>=1 AND SUM(Begriffstext='Hilfe')>=1 AND SUM(Begriffstext='Befehlsreferenz')>=1

    Resultat: Die Id aller Medien vom Typ Sachbuch, die die Begriffe "MySql","Hilfe" und "Befehlsreferenz" enthalten, nicht aber den Begriff "PHP".

    Jetzt bräuchte ich in dem Moment nicht die eigentlichen Id's, sondern nur mal die Anzahl der Id's, die der Abfrage entsprechen.
    Das lässt sich doch bestimmt verwirklichen? Mit "Select COUNT(*)..." zählts mir die Anzahl der Einträge pro Id, die der Abfrage entsprechen. Ich müsste aber die Anzahl der Gruppen haben, die der Abfrage entsprechen, also sozusagen eine Ebene höher. Nach Studium verschiedener sql/mysql Infoseiten komm ich auf keine funktionierende Variante?

    Dankeschön!

    1. SELECT b.Id from begrifftabelle as b,medientabelle as m WHERE Medienart='Sachbuch' AND b.Id=m.Id AND b.Id NOT IN(SELECT Id FROM begriff WHERE Begriffstext='PHP') GROUP BY b.Id HAVING SUM(Begriffstext='MySql')>=1 AND SUM(Begriffstext='Hilfe')>=1 AND SUM(Begriffstext='Befehlsreferenz')>=1

      anstatt NOT IN(...) kann ich das natürlich auch über ne SUM(...)<1 machen. :)