brand: MySQL Query

Hi!

So jetzt versuche ich mich auch mal ein wenig in Sachen Datenbanken, und da ich eigentlich keine Ahnung von SQL habe stehe ich vor folgendem Problem:

Ich möchte in zwei Spalten (von zwei verschiedenen Tabellen) nach Zeichenketten suchen. Gibt es dabei eine Möglichkeit diese zwei Spalten zu einer zu verknüpfen, damit ich nur EINE LIKE-Anweisung in meiner Query benötige (also auf die Art: ... where (tabelle1.spalte1 + tabelle2.spalte2) like "%abc%") oder bedarf es eben PRO Spalte einer LIKE-Anweisung?

Was ich mir bis jetzt zusammengebastelt haben:

select rezept.name,ingre.name from rezept left join ingre on ingre.reznr=rezept.nr where rezept.name like "%irgendwas%" OR ingre.name like "%irgendwas%" group by rezept.name

Das gibt mir zwar genau das aus, was ich möchte, nur wäre es nett, wenn es eine Möglichkeit gäbe diese zwei Like-Abfragen zu einer zusammenzufassen (da sonst pro weiterer Zeichenketten nach der gleichzeitig gesucht werden soll, jeweils wieder ZWEI like-Anweisungen hinzukommen - also wenn ich nach zwei Ausdrücken suche habe ich vier Like-Abfragen usw.

mfG
BRAND

  1. Das gibt mir zwar genau das aus, was ich möchte, nur wäre es nett, wenn es eine Möglichkeit gäbe diese zwei Like-Abfragen zu einer zusammenzufassen (da sonst pro weiterer Zeichenketten nach der gleichzeitig gesucht werden soll, jeweils wieder ZWEI like-Anweisungen hinzukommen - also wenn ich nach zwei Ausdrücken suche habe ich vier Like-Abfragen usw.

    Das klingt nach einem mißlungenen relationalen Entwurf.

    Wenn diese Spalten verschiedene Bedeutungen haben, dann
    macht Deine Abfrage keine Sinn.
    Wenn sie dieselbe Bedeutung haben, wieso sind sie dann
    auf verschiedene Tabellen verteilt?

    Ohne Änderung Deiner Tabellenstruktur sehe ich keine
    elegantere Lösung. (In SQL würde ich UNION verwenden.)

    Der angegebene LEFT JOIN (was kein Standard-SQL ist)
    macht übrigens etwas völlig Anderes als das, was Du
    in Deinem erklärenden Text beschreibst (nicht die
    Obermenge, sondern die Schnittmenge). Was genau willst
    Du haben?

    1. Hi!

      Das klingt nach einem mißlungenen relationalen Entwurf.

      das ist leicht möglich

      Wenn diese Spalten verschiedene Bedeutungen haben, dann
      macht Deine Abfrage keine Sinn.
      Wenn sie dieselbe Bedeutung haben, wieso sind sie dann
      auf verschiedene Tabellen verteilt?

      die Spalten haben verschiedene Bedeutung und trotzdem halte ich die Abfrage für sinnvoll.

      Zur Erläuterung meiner Gedanken diesbezüglich:

      rezept enthält die Felder
      nr (eindeutige nr),
      name (name des rezepts),
      und noch ein paar weitere (Zubereitung, Kommentar, ...).

      Nun beinhaltet ein Rezept eine unbestimmte Anzahl von Ingredienzien. Deshalb die Tabelle ingre mit den Feldern
      id (eindeutige nummer),
      name (name der Ingredienz),
      reznr (die nr des Rezeptes zu dem diese Ingredienz gehört)
      und noch ein paar andere (Menge, Alkoholgehalt, etc.)

      ich möchte nun nach einem Begriff suchen wobei die Query das Rezept ausgibt bei dem der Begriff entweder im namen des Rezeptes vorkommt oder im Namen einer Ingredienz. Es soll dabei ein Rezept nur einmal ausgegeben werden.

      Also: wenn ich nun z.Bsp. nach "Tequila" suche macht es sinn sowohl die namen der Rezepte (Treffer z.Bsp.: "Tequila Sunrise") als auch die namen der Ingredienzien (Treffer z.Bsp: Tequila als Ingredienz von Tequila Sunrise und von Margarita) zu durchsuchen. Außerdem soll der Besucher einfach einen Begriff eingeben und nicht auswählen müssen ob er nun nach einem Rezeptnamen sucht oder nach einer Ingredienz ("Bloody Mary" wird nur in rezept.name gefunden nicht aber in ingre.name, "Zironensaft" dagegen wird nur in ingre.name gefunden und nicht in rezept.name)

      Und genau das macht meine Query (war wohl eher Zufall) ;-)

      Meine Frage bezog sich nun darauf, ob ich die 2 LIKE-Abfragen zu einer zusammenfassen kann (sonst habe ich ja bald eine elendslange Query wenn nun jemand nach Gin Wodka Whisky Rum Cognac und Tequila sucht, v.a. weil ich noch eine dritte Spalte einer weiteren Tabell gleichzeitig durchsuchen möchte) - aber wie ich aus den anderen Antworten entnehme ist das wohl nicht (oder nur durch zusätzlichen Aufwand, der meine "Vereinfachung" ja ad absurdum führen würde) möglich.

      mfG
      BRAND

      1. Hi,

        wenn ich richtig verstanden habe, willst Du aus table1 alles auslesen, was in einer ihrer Spalten identisch ist mit dem, was in einer bestimmten Spalte der table2 steht. Richtig?

        In SQL (auf MYSQL und Variablenuebergabe abzuaendern) wuerde ich das folgendermassen fassen:

        select
        a.*
        from
        table1 a,
        table2 b
        where
        a.spalt_x=b.spalte_y

        Ist Dir damit einwenig gedient?

        Gruss
        Nico

        Hi!

        Das klingt nach einem mißlungenen relationalen Entwurf.

        das ist leicht möglich

        Wenn diese Spalten verschiedene Bedeutungen haben, dann
        macht Deine Abfrage keine Sinn.
        Wenn sie dieselbe Bedeutung haben, wieso sind sie dann
        auf verschiedene Tabellen verteilt?

        die Spalten haben verschiedene Bedeutung und trotzdem halte ich die Abfrage für sinnvoll.

        Zur Erläuterung meiner Gedanken diesbezüglich:

        rezept enthält die Felder
        nr (eindeutige nr),
        name (name des rezepts),
        und noch ein paar weitere (Zubereitung, Kommentar, ...).

        Nun beinhaltet ein Rezept eine unbestimmte Anzahl von Ingredienzien. Deshalb die Tabelle ingre mit den Feldern
        id (eindeutige nummer),
        name (name der Ingredienz),
        reznr (die nr des Rezeptes zu dem diese Ingredienz gehört)
        und noch ein paar andere (Menge, Alkoholgehalt, etc.)

        ich möchte nun nach einem Begriff suchen wobei die Query das Rezept ausgibt bei dem der Begriff entweder im namen des Rezeptes vorkommt oder im Namen einer Ingredienz. Es soll dabei ein Rezept nur einmal ausgegeben werden.

        Also: wenn ich nun z.Bsp. nach "Tequila" suche macht es sinn sowohl die namen der Rezepte (Treffer z.Bsp.: "Tequila Sunrise") als auch die namen der Ingredienzien (Treffer z.Bsp: Tequila als Ingredienz von Tequila Sunrise und von Margarita) zu durchsuchen. Außerdem soll der Besucher einfach einen Begriff eingeben und nicht auswählen müssen ob er nun nach einem Rezeptnamen sucht oder nach einer Ingredienz ("Bloody Mary" wird nur in rezept.name gefunden nicht aber in ingre.name, "Zironensaft" dagegen wird nur in ingre.name gefunden und nicht in rezept.name)

        Und genau das macht meine Query (war wohl eher Zufall) ;-)

        Meine Frage bezog sich nun darauf, ob ich die 2 LIKE-Abfragen zu einer zusammenfassen kann (sonst habe ich ja bald eine elendslange Query wenn nun jemand nach Gin Wodka Whisky Rum Cognac und Tequila sucht, v.a. weil ich noch eine dritte Spalte einer weiteren Tabell gleichzeitig durchsuchen möchte) - aber wie ich aus den anderen Antworten entnehme ist das wohl nicht (oder nur durch zusätzlichen Aufwand, der meine "Vereinfachung" ja ad absurdum führen würde) möglich.

        mfG
        BRAND

      2. rezept enthält die Felder
        nr (eindeutige nr),
        name (name des rezepts),
        und noch ein paar weitere (Zubereitung, Kommentar, ...).

        Nun beinhaltet ein Rezept eine unbestimmte Anzahl von Ingredienzien. Deshalb die Tabelle ingre mit den Feldern
        id (eindeutige nummer),
        name (name der Ingredienz),
        reznr (die nr des Rezeptes zu dem diese Ingredienz gehört)
        und noch ein paar andere (Menge, Alkoholgehalt, etc.)

        Aah, ja.

        Der relationale Entwurf, der Dein "Problem" lösen
        würde, wäre:
        1. Definiere einen Begriff, der eine semantische
           Obermenge über "Rezept" und "Ingredienz" darstellt.
        2. Ergänze Deine beiden Tabellen um eine 3. Tabelle
           "alles" mit Feldern "Name", "Sorte" (neu, enthält
           "Rezept" bzw. "Ingredienz") und "Index" (verweist
           auf Primärschlüssel in einer der beiden bisherigen
           Tabellen mit den sortenspezifischen Attributen).
           Dafür entfällt "Name" aus den bisherigen Tabellen.
        Jetzt kannst Du sowohl über beide Mengen zugleich
        eine Suche durchführen als auch jederzeit per Query
        'where Sorte="Rezept"' etc. eine Teilmenge heraus-
        projezieren. In SQL würde man dann VIEWs definieren,
        die dies statisch tun und die Du dann fast wie Tabellen
        ansprechen kannst.

        Nachteil: Du kannst nun die Attribute einer einzelnen
        Sorte nur noch über einen JOIN zwischen seinem Namen
        und seinen Eigenschaften ansprechen.
        Wenn die meisten Deiner Abfragen über nur eine Deiner
        Tabellen laufen, würde ich das Tabellenschema nicht
        ändern, sondern eher mit diesem Sonderfall leben.

        Die Mengenaddition, die Du offenbar willst, würde in
        SQL mit dem UNION-Operator ausgedrückt werden. Daß
        es zwei Queries sind, ist nicht zu ändern.

        Meine Frage bezog sich nun darauf, ob ich die 2
        LIKE-Abfragen zu einer zusammenfassen kann (sonst
        habe ich ja bald eine elendslange Query wenn nun
        jemand nach Gin Wodka Whisky Rum Cognac und Tequila
        sucht, v.a. weil ich noch eine dritte Spalte einer
        weiteren Tabelle gleichzeitig durchsuchen möchte) -
        aber wie ich aus den anderen Antworten entnehme ist
        das wohl nicht (oder nur durch zusätzlichen Aufwand,
        der meine "Vereinfachung" ja ad absurdum führen
        würde) möglich.

        Je komplexer Dein Tabellensystem wird, desto länger
        und komplizierter werden die entsprechenden Queries.
        (Deine ist noch sehr harmlos!)
        Deshalb gibt es ja GUIs, mit denen man so etwas per
        drag & drop zusammenfügen kann. (Mit etwa denselben
        Folgen wie bei WYSIWYG-HTML-Editoren ... ;-)

        Aber wenn Du immer mehr "Sorten" erfindest, dann wird
        ein Umbau Deiner Tabellenstruktur immer sinnvoller.

        1. Hi!

          Also ich glaub ich bleib bei dem längeren Query (im prinzip ist's ja egal weil ich die Abfrage ja durch eine Schleife zusammemsetze)

          danke,
          mfG
          BRAND

  2. Hi!

    So jetzt versuche ich mich auch mal ein wenig in Sachen Datenbanken, und da ich eigentlich keine Ahnung von SQL habe stehe ich vor folgendem Problem:

    Ich möchte in zwei Spalten (von zwei verschiedenen Tabellen) nach Zeichenketten suchen. Gibt es dabei eine Möglichkeit diese zwei Spalten zu einer zu verknüpfen, damit ich nur EINE LIKE-Anweisung in meiner Query benötige (also auf die Art: ... where (tabelle1.spalte1 + tabelle2.spalte2) like "%abc%") oder bedarf es eben PRO Spalte einer LIKE-Anweisung?

    Was ich mir bis jetzt zusammengebastelt haben:

    select rezept.name,ingre.name from rezept left join ingre on ingre.reznr=rezept.nr where rezept.name like "%irgendwas%" OR ingre.name like "%irgendwas%" group by rezept.name

    Das gibt mir zwar genau das aus, was ich möchte, nur wäre es nett, wenn es eine Möglichkeit gäbe diese zwei Like-Abfragen zu einer zusammenzufassen (da sonst pro weiterer Zeichenketten nach der gleichzeitig gesucht werden soll, jeweils wieder ZWEI like-Anweisungen hinzukommen - also wenn ich nach zwei Ausdrücken suche habe ich vier Like-Abfragen usw.

    Ich würde sagen, daß diese Formulierung eigendlich ganz in Ordnung ist. Es gäbe da vielleicht noch die Möglichkeit, da was mit Subqueries zu machen, oder erst mal ne temporäre Tabelle anzulegen, und dort erst mal die beiden Spalten hinzutransferieren. Aber das macht einfach zu viel Aufwand. Ich würde die Abfrage so lassen.

  3. select rezept.name,ingre.name from rezept left join ingre on ingre.reznr=rezept.nr where rezept.name like "%irgendwas%" OR ingre.name like "%irgendwas%" group by rezept.name

    Das gibt mir zwar genau das aus, was ich möchte, nur wäre es nett, wenn es eine Möglichkeit gäbe diese zwei Like-Abfragen zu einer zusammenzufassen (da sonst pro weiterer Zeichenketten nach der gleichzeitig gesucht werden soll, jeweils wieder ZWEI like-Anweisungen hinzukommen - also wenn ich nach zwei Ausdrücken suche habe ich vier Like-Abfragen usw.

    Hallo Brand,

    ich meine diese Art der Zusammenfassung für LIKE gibt es nicht. Das könnte daran liegen, dass die Art der Abfrage auch aeusserst selten vorkommen duerfte.

    Viele Gruesse

    Beate Mielke