(My)SQL - Abfrage: IN und LIKE kombinieren?
paul
- datenbank
hallo,
ich möchte gern aus einer mySQL - tabellenspalte folgende abfrage haben:
beispiel:
die tabelle beinhaltet die worte auto,automat,hinz,kunz
ich hätte gerne sowas: SELECT*FROM tabelle WHERE spalte IN ('%auto%','%hinz%')
-geht aber nicht, weil werte a la '%auto%' nur bei LIKE möglich sind ,oder?
wie krieg ich also eine IN-abfrage hin, die nach wort-teilen sucht???
danke euch!
paul
Hallo,
ich hätte gerne sowas: SELECT*FROM tabelle WHERE spalte IN ('%auto%','%hinz%')
-geht aber nicht, weil werte a la '%auto%' nur bei LIKE möglich sind ,oder?wie krieg ich also eine IN-abfrage hin, die nach wort-teilen sucht???
mit einer logischen ODER-Verknüpfung. Der entsprechende Operator heißt bei MySQL und vielen anderen SQL-Dialekten OR.
Freundliche Grüße
Vinzenz
mit einer logischen ODER-Verknüpfung. Der entsprechende Operator heißt bei MySQL und vielen anderen SQL-Dialekten OR.
ok, d.h. [...]WHERE spalte LIKE '%auto%' OR spalte LIKE '%hinz%'
stimmt das so?
wie gehe ich also damit um, wenn jemand in ein formularfeld für den suchbegriff folgendes eingibt: "auto, hinz"?
muss ich die zeichenkette zerlegen und dann in die OR- anweisung einbauen, oder gibts eine möglichkeit, gleich die ganze zeichenkette als abfrage in mein sql-statement einzubauen?
danke nochmal
p
Hello,
ok, d.h. [...]WHERE spalte LIKE '%auto%' OR spalte LIKE '%hinz%'
stimmt das so?
theoretisch schon. Das macht aber die Abfrage _extrem_ teuer.
wie gehe ich also damit um, wenn jemand in ein formularfeld für den suchbegriff folgendes eingibt: "auto, hinz"?
muss ich die zeichenkette zerlegen und dann in die OR- anweisung einbauen, oder gibts eine möglichkeit, gleich die ganze zeichenkette als abfrage in mein sql-statement einzubauen?
Das hängt von der Intelligenz Deines Abfragetools und dessen Möglichkeiten im Frontend ab.
Suchbegriff fängt an mit enthält endet mit Versalien beachten
ja nein
hinz (o) (o)
Kunz (o) (o)
Die am Frontend einfach erscheinenden Suchwerkzeuge beachten derartige "Einstellungen" automatisch und bauen daraus eine möglichst billige Abfrage.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hello,
»» ok, d.h. [...]WHERE spalte LIKE '%auto%' OR spalte LIKE '%hinz%'
»»
»» stimmt das so?theoretisch schon. Das macht aber die Abfrage _extrem_ teuer.
steh grad auf der leitung- was heisst "teuer" im zusammenhang mit sql??
Die am Frontend einfach erscheinenden Suchwerkzeuge beachten derartige "Einstellungen" automatisch und bauen daraus eine möglichst billige Abfrage.
was meinst du mit "frontend"? ich hab eine simple php-datei mit einem formular mit suchfeld. dies wird an meine datei mit der sql-abfrage geschickt. ich möchte wissen, wie ich mit dem suchbegriff umgehen soll, den jemand in das formularfeld eingegeben hat, damit ich zu einem vernünftigen sql-statement komme...
lg
p
Hello,
»» ok, d.h. [...]WHERE spalte LIKE '%auto%' OR spalte LIKE '%hinz%'
»»
»» stimmt das so?theoretisch schon. Das macht aber die Abfrage _extrem_ teuer.
steh grad auf der leitung- was heisst "teuer" im zusammenhang mit sql??
Eine Abfrage eines feststehenden Wertes auf Identität mit einer Spalte einer Tabelle ist billig, weil hier nur die Spalte auf exakte Übereinstimung durchsucht werden muss
Eine Abfrage eines feststehenden Wertes auf Identität mit einer Spalte einer Tabelle, die indiziert ist, ist extrem billig, weil hier eine binäre Suche im Index der Seite durchgeführt werden kann.
Eine Abfrage eines feststehenden Wertes auf Übereinstimnung mirt dem Beginn einer Spalte einer Tabelle ist, je nach Impelementation aufwändig bis relativ billig, weil hier nur die Spalte auf Übereinstimung ihres Beginns durchsucht werden muss oder aber sogar der Index dazu benutzt werden kann.
Bei intelligenten Systemen gilt das auch für das Vorkommen am Ende einer Spalte, wenn über diese Spalte ein Index in voller Breite angelegt wurde...
Wenn man aber nun nur das Vorkommen eines Wertes innerhalb der Werte einer Spalte (sogenannte Binnensuche) untersuchen will, dann müssen alle Werte der Spalte Schritt für Schritt auf eine anteilige Übereinstimmung mit dem gesuchten Wert untersucht werden. Das geht i.d.R. nicht mit einem Index und muss Datensatz für Datensatz aufwändig durchgeführt werden.
Das bezeichnet man dann als "extrem teuer"
Die am Frontend einfach erscheinenden Suchwerkzeuge beachten derartige "Einstellungen" automatisch und bauen daraus eine möglichst billige Abfrage.
was meinst du mit "frontend"?
Das Frontend ist die dem Benutzer zur Verfügung gestellte Schnittstelle.
ich hab eine simple php-datei mit einem formular mit suchfeld.
Das Formular gehört innerhalb des Browserfensters zum Frontend
dies wird an meine datei mit der sql-abfrage geschickt.
Und landet dann in der Datenübernahme des "Controllers"
ich möchte wissen, wie ich mit dem suchbegriff umgehen soll, den jemand in das formularfeld eingegeben hat, damit ich zu einem vernünftigen sql-statement komme...
Überlege zuerst, ob dieser Suchbegriff
#---
usw. falls Dir noch 'was einfällt.
Ohne Überlegung wird Deine Suche aber bei größeren Datenmengen eher ins Chaos führen als zu sinnvollen Treffern :-P
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Guten Tag,
wie krieg ich also eine IN-abfrage hin, die nach wort-teilen sucht???
Kann dir vielleicht eine Volltext-Suche helfen?
Gruß
Christoph Jeschke
Hi,
ich hätte gerne sowas: SELECT*FROM tabelle WHERE spalte IN ('%auto%','%hinz%')
Wie Christoph schon meinte, würde sich eine Volltextsuche dafür empfehlen, solange du nicht wirklich einen Joker am Wortanfang benötigst. Das könnte so aussehen:
SELECT * FROM meine_tabelle WHERE MATCH meine_spalte1,... AGAINST
('auto* OR hinz*' IN BOOLEAN MODE)
Um eine bessere Sortierung zu bekommen (bm25), könnte man dann im default mode Sortieren:
ORDER BY MATCH meine_spalte1,... AGAINST ('auto hinz') DESC
Voraussetzung wäre MyISAM Engine.
Bis ca 100 000 Datensätze je nach System ok, sonst würd ich nicht unbedingt einen Joker verwenden. Wenns wirklich große Datenmengen wind, würde ich das gar nicht mit MySql machen.
Schöne Grüße,
Jonny 5