SQL Komplette Tabelle nach VARCHAR durchsuchen

selberbauer

Captain
Registriert
Juni 2009
Beiträge
3.604
Hallo,
Ich habe eine Kontajt Tabelle, welche folgende Spalten enthält:
id, forname, surname, birth, addresse, nr, plz, mail, tel, mobil

Nun möchte ich alle Spalten nach durchsuchen.
Daher, wenn ich in mein Suchfeld "joachim" eintrage soll ich den Datensatz aller Joachims ausgegeben bekommen, genauso wie, wenn ich nach allen mit der PLZ 44056 suche.

Ich habe das mit folgendem SQL Befehl probiert:
Code:
SELECT * FROM contacts WHERE * = ?
? = wird im prepared statement (mysqli) mit dem Suchbegriff ersetzt.
Das klappt, allerdings nicht, weil * nicht in der WHERE Clause stehen darf.
 
Ich versteh Deine Aussage nicht. Im Feld BIRTH wird ja wohl nicht JOACHIM drin stehen.

select * from ... where forname = 'JOACHIM' oder
select * from ... where forname like 'JOACHIM%'
 
Das Funktioniert nur indem du wirklich jede Spalte einzeln abfragst:

Code:
SELECT * FROM contacts WHERE id = <joachim> or surname = <joachim> etc..

Ist allerdings bei großen Datenmengen nicht besonders performant.
Ergänzung ()

kagel10 schrieb:
Ich versteh Deine Aussage nicht. Im Feld BIRTH wird ja wohl nicht JOACHIM drin stehen.

Stimme dir grundsätzlich zu, schon die Datentypen dürften hier unterschiedlich sein. Ich vermute, dass der TE eine Art globale Suche umsetzen möchte, unabhängig davon was eingegeben und wonach gesucht wird.
 
@kagel10: das wird dann spaßig falls er irgendwann man 20 Felder hat und die dann alle einzeln durchsuchen muss.

@AlbertLast:
Was soll ihm das bringen wenn er z.B. ne Volltextsuche in ein Programm reinmachen will ?

@topic:
Evtl. kannst du das über nen Umweg machen und die Felder vorher zusammenfassen und dann darin suchen, also etwa so:
http://sql.1keydata.com/de/sql-kaskadieren.php
 
Hallo,
danke für die schnellen Antworten.

@kagel
Das im Geburtsdatum, Telefonnummer der Name nicht drin steht ist kohärent oder?


Also man soll über ein einziges Suchfeld, alles ersuchen können.
Beispielsweise alle Leute, die am 12.4 Geburtstag haben, alle die meinetwegen in einem Ort leben, alle deren Nachname gleich ist.

Dabei müssen natürlich alle Spalten und alle Datensätze nach dem Suchbegriff abgefragt werden...



Ich habe mal in Adminer geschaut, wie Adminer das löst:
Code:
SELECT * FROM `contacts` WHERE (`forename` = 'joachim' OR `surname` = 'joachim' OR `birth` = 'joachim' OR `addresse` = 'joachim' OR `nr` = 'joachim' OR `plz` = 'joachim' OR `mail` = 'joachim' OR `tel` = 'joachim' OR `mobil` = 'joachim') LIMIT 30

bzw. in der perforanteren Fassung
Code:
SELECT id, forename, surname, birth, addresse, nr, plz, mail, tel, mobil FROM contacts WHERE (forename = 'Joachim' OR surname = 'Joachim' OR birth = 'Joachim' OR addresse = 'Joachim' OR nr = 'Joachim' OR plz = 'Joachim' OR mail = 'Joachim' OR tel = 'Joachim' OR mobil = 'Joachim')

Aber das kommt Blutschumpfs kaskadieren gleich, nicht wahr?


Um nun die Volltextsuche zu erweitern müsste ich noch folgende Varianten hinzufügen:
1. mit Kleinbuchstaben
2. mit Großbuchstaben am Anfang
3. Wortteile (mit regulären Ausdrücken)

Wie gehe ich mit 3. vor und lohnt es sich den gesamten Code in eine Klasse zu packen?
 
Volltextsuche ist eine rdbms funktion
in deinem fall mysql.

da für musst du nicht an dein programm rumdoktoren.
 
Das ist aber nicht wirklich ne Antwort auf die Fragestellung, man muss ja hier weiterhin die einzelnen Felder angeben.

Ich verstehe es so, dass er nach ner Query sucht die die ganze Table durchsucht ohne die einzelnen Felder zu spezifizieren.
 
MySQL only wäre mir keine Lösung bekannt.

Mein Ansatz wäre folgender:
Alle Felder der Tabelle abfragen zB. mysql_list_fields()
Query manuell zusammenbauen so wie es oben gepostet wurde:
SELECT * FROM `table` WHERE (`name` = 'joachim' OR `vorname` = 'joachim' OR ... )
 
nein du denkst zu einfach,
du willst eine volltext suche machen (du willst über mehr spalten suchen)
und dann willst du "einfsch" mit ein wildcard über die spalten machen,
das geht aber nicht weil das nicht vorgesehn ist im sql standard.
 
Mein Ansatz wäre folgender:
Alle Felder der Tabelle abfragen zB. mysql_list_fields()
Query manuell zusammenbauen so wie es oben gepostet wurde:
SELECT * FROM `table` WHERE (`name` = 'joachim' OR `vorname` = 'joachim' OR ... )
Werde ich mal ausprobieren
nein du denkst zu einfach,
du willst eine volltext suche machen (du willst über mehr spalten suchen)
und dann willst du "einfsch" mit ein wildcard über die spalten machen,
das geht aber nicht weil das nicht vorgesehn ist im sql standard.
Die SQL Lösung habe ich ja bereits, nur schöner wäre schön.
Aber anscheinend, hat war da noch kein Bedarf auf eine solche Funktion, weswegen man kapseln muss (s. o.)
SELECT * FROM `contacts` WHERE (`forename` = 'joachim' OR `surname` = 'joachim' OR `birth` = 'joachim' OR `addresse` = 'joachim' OR `nr` = 'joachim' OR `plz` = 'joachim' OR `mail` = 'joachim' OR `tel` = 'joachim' OR `mobil` = 'joachim')
 
Ich kann dir nur davon abraten alle Spalten zu scannen. Wenn du eine neue hinzufügst, die nicht durchsucht werden soll, dann bekommst du schnell Probleme. z.B. wenn da Daten drin stehen, die der Benutzer nicht sehen soll.

In der Praxis erstellt man einfach eine Klasse, mit der auf die Tabelle contacts zugegriffen wird. Dort kannst du in einem statischen Array eine Liste von Spaltennamen hinterlegen, die durchsucht werden dürfen. Daraus kannst du dann automatisch eine SQL-Abfrage erstellen lassen.
 

Ähnliche Themen

Zurück
Oben