MySQL Query
brand
- datenbank
0 Michael Schröpl0 brand0 Nico0 Michael Schröpl0 brand
0 Erik Tews0 Beate Mielke
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
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?
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
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
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.
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
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.
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