Mehrere Spalten durchsuchen
Christian
- datenbank
0 André Laugks0 lulu
Hallo
Ich habe eine Mysql Datenbank mit ein paar Spalten, etwa so:
time | 1 | 2 | 3 | 4
Gibt es jetzt ein Möglichkeit in mehreren Spalten in der ganzen Tabelle nach einem String zu suchen? Ich kenne nur
... WHERE 1
='string' OR 2
='string' OR ...
gibt es nicht einen Befehl, um gleich einen Spaltenbereich zu durchsuchen? Etwa
... WHERE 1
TO 4
='string'
mfg
Christian
Hallo!
time | 1 | 2 | 3 | 4
Gibt es jetzt ein Möglichkeit in mehreren Spalten in der ganzen Tabelle nach einem String zu suchen?
Ja, ist aber DRECKIG.
SELECT spalte FROM tabelle WHERE CONCAT(spalte_1, spalte_2, spalte_n) LIKE '%suchwert%';
Mit CONCAT() baut man einen String der angegebenen Spalten zusammen und den vergleicht man mit LIKE.
Drecking ist dabei, daß man CONCAT() nicht in der WHERE-Klausel einsetzen sollte.
Ich setze das bei einer Suche wie beschrieben ein. Dort fasse ich 2-3 Spalten mit dem Typ VARCHAR und eine vom Typ TEXT zusammen. Bei 20.000 Datensätzen merkt man nicht. Bei 50.000 Datensätzen wurde es schon was langsamer. Bei 100.000 Datensätzen hat es schon so 1-1,5 Minuten gedauert. Die Tabelle war mit den 100.000 Datensätzen so 80 MB groß. Ich hatte zum testen die Datensätze immer kopiert.
MfG, André Laugks
Hallo André
SELECT spalte FROM tabelle WHERE CONCAT(spalte_1, spalte_2, spalte_n) LIKE '%suchwert%';
besser ist es u.U. CONCAT_WS, oder zusätzlich BINARY zu benutzen, da man sonst unerwünschte
Treffer erzielt.
Beispiel:
Nachname Beruf Ort
----------------------------------------
Meier Koch Erlangen
Schurei Erfinder Köln
Schmidt Hebammme Iergendwo
wenn man hier die Spalten "zusammenklebt" und z.B. nach 'eier', oder auch 'eierkocher'
sucht ergeben sich Treffer die in dieser Form vermutlich eher unbeabsichtigt sind ;-)
Ich setze das bei einer Suche wie beschrieben ein. Dort fasse ich 2-3 Spalten mit dem Typ VARCHAR und eine vom Typ TEXT zusammen. Bei 20.000 Datensätzen merkt man nicht. Bei 50.000 Datensätzen wurde es schon was langsamer. Bei 100.000 Datensätzen hat es schon so 1-1,5 Minuten gedauert. Die Tabelle war mit den 100.000 Datensätzen so 80 MB groß. Ich hatte zum testen die Datensätze immer kopiert.
hast Du das mal mit einer Abfrage der Art
SELECT spalte
FROM tabelle
WHERE
(spalte_1 LIKE '%suchwert%')
OR
(spalte_2 LIKE '%suchwert%')
OR
(spalte_3 LIKE '%suchwert%')
verglichen?
Das würde mich interessieren wie da die Unterschiede sind (werde ich bei Gelegenheit mal ausprobieren).
Ansonsten benutze ich diese "DRECKIGE" Abfrage auch öfter und bisher war das immer recht
schnell, es waren allerdings auch nie mehr als einige Hundert bis wenige Tausend Datensätze.
Viele Grüße
lulu
Hi lulu,
hast Du das mal mit einer Abfrage der Art
SELECT spalte
FROM tabelle
WHERE
(spalte_1 LIKE '%suchwert%')
OR
(spalte_2 LIKE '%suchwert%')
OR
(spalte_3 LIKE '%suchwert%')
verglichen?
Das würde mich interessieren wie da die Unterschiede sind (werde ich bei Gelegenheit mal ausprobieren).
beide Konstrukte sind gleich schlecht (wenn die concat-Variante zusätzliche Treffer an den "Klebestellen" ausschließt) - keines von beiden kann vorhandene Indexbäume nutzen.
Das kann durchaus mehrere Zehnerpotenzen kosten ...
Viele Grüße
Michael
Hallo!
wenn man hier die Spalten "zusammenklebt" und z.B. nach 'eier', oder auch 'eierkocher'
sucht ergeben sich Treffer die in dieser Form vermutlich eher unbeabsichtigt sind ;-)
Richtig! Ich habe gepennt und es nicht geschrieben. Ich nehme nicht CONCAT_WS(), sondern setze immer ein Leerzeichen zwischen den Spalten. Damals kannte ich CONCAT_WS() noch nicht.
CONCAT(spalte, ' ', spalte_1)
hast Du das mal mit einer Abfrage der Art
SELECT spalte
FROM tabelle
WHERE
(spalte_1 LIKE '%suchwert%')
OR
(spalte_2 LIKE '%suchwert%')
OR
(spalte_3 LIKE '%suchwert%')verglichen?
Ja, es war viel viel schneller. Ich konnte es aber so nicht machen, weil ich OR, AND und NOT generiere, je nach dem wie der Suchstring ist. Deshalb fasse ich auch die Spalten zusammen. Mit dem OR pro Spalte, waren die Suchergebnisse nicht genau. Wenn es bei einer Spalte passt, gibt es ein Treffer.
Das dumme, so gibt es mehrere CONCAT() in der WHERE-Klausel :-(.
Wie gesagt, sehr sehr dreckig! ;-)
Ansonsten benutze ich diese "DRECKIGE" Abfrage auch öfter und bisher war das immer recht
schnell, es waren allerdings auch nie mehr als einige Hundert bis wenige Tausend Datensätze.
Bei mir genau so.
MfG, André Laugks