SELECT über (fast) alle Felder automatisieren?

Hallo,

ich habe eine Tabelle (MySQL-Datenbank), die neben einem ID-Feld ca 50 Felder für Inhalte hat. Nun möchte ich in PHP über alle Felder eine Suche durchführen, also einen eingegebenen Suchbegriff in allen (oder fast allen) Feldern suchen.

Kann ich das SELECT…WHERE irgendwie abkürzen oder muss ich alle 50 Felder ausschreiben?
Ich wünsche mir so etwas wie:

SELECT \* FROM wurstplatte WHERE wurstplatte.\* LIKE 'salami'

(hab ein wenig experimentiert, aber funktioniert hat bisher nichts dergleichen)

Zusätzlich gibt es in meiner Datenbank weitere Tabellen, die ähnlich wie die erste aufgebaut sind, aber andere Feldbezeichnungen haben. Super wäre es, wenn ich in der Abfrage nur den Namen der Tabelle austauschen müsste, so dass die Suche auf diese Tabelle ebenso funktioniert.

Geht das irgendwie?
Vielen Dank und viele Grüße
Wolf-Gang

hi Wolf-Gang

ohne jetzt speziell mysql zu kennen: ich helfe mir bei ähnlichen fällen mit folgendem konstrukt:

select * from tabelle where feld1 || feld 2 || feld3 || feld4 like ‚%text%‘;

ist meiner meinung nach die kompakteste methode, das zu erledigen.

wenn das für mehrere tabellen gehen soll, ist das natürlich auch nicht soooo brauchbar. du müsstest da einen kleinen generator vorschalten, der dir das richtige statement einfach generiert. irgendwo muss ja auch mysql ablegen, welche spalten eine tabelle hat (im oracle ist das im data-dictionary, speziell in der user_tab_columns). ein kleines script kann nun leicht einen string zusammenbauen, der das obige statement pro tabelle anpasst. danach den string mit einem execute ausführen.

alternative dazu: falls sich die tabellen selten ändern (also weder die struktur der tabellen als auch neue tabelle dazu), dann kannst du pro tabelle eine view erzeugen, die die relevanten spalten zusammenhängt. damit ist die suche dann etwas leichter. das create-statement für die views kann man dann wieder automatisch zusammenbauen lassen. wäre also ein überschaubarer aufwand.

lg
erwin

Hi
dies

select * from tabelle where feld1 || feld 2 || feld3 || feld4
like ‚%text%‘;

ist aber nur fast das, was gesucht wurde.

Wenn feld2 ‚ente‘ enthält und feld2 ‚xtra‘ würde die Zeile selectiert werden, auch wenn nirgends wirklich text enthalten ist.

Mann könnte anfangen mit Trennzeichen zu hantieren, die im Suchstring nicht vorkommen aber das wird schnell aufwendiger als das ursprüngliche Statement.

Helfen könnte eine kleine Routine, die dir die SQL Statements baut. Ich vermute auch in deiner DB gibt es eine Tabelle aus der man selektieren kann, welche Tabelle welche Spalten enthält. Mit dieser Information könnte man sich die gewünschten Statements dynamisch zusammenbauen.

Für Details habe ich leider zu wenig Ahnung von der DB deiner Wahl.

Jens

hi Jens

du hast recht. es war für mich offensichtlich, dass das von dir angesprochene problem auftritt und habe stillschweigend angenommen, dass ein potentieller anwender meiner lösung die trennzeichen einbaut.

die trennzeichen sollten aber dann nicht stören, wenn die suche über views vereinfacht wird.

dein hinweis, die abfragen selbst zu generieren, ist schon richtig. ich bin halt davon ausgegangen, dass vor allem die zugriffe auf die tabelle möglichst flott und simpel gehen sollen. da ist es eben besser, die sql-statements schon vorher in views zu kapseln.

allerdings muss ich an dieser stelle die generelle vorgehensweise in frage stellen. offenbar ist eine art „google für datenbank“ gewünscht, also ein einziges suchfeld und das system liefert alles, was irgendwo zum thema gefunden wird. das widerspricht natürlich dem relationalen ansatz mit normalisierung und so.

wenn das zielsystem überschaubar klein ist, ist das auch ok so. sobald die daten aber anwachsen und gross werden, wird so eine abfrage aber lähmend langsam. sinnvoller ist es dann, die daten in ein geeignetes format zu exportieren und eine volltext-suche darüber laufen zu lassen. mit allen vor- und nachteilen… und mit mysql vielleicht auch nicht so leicht möglich…

lg
erwin

Hi!

allerdings muss ich an dieser stelle die generelle
vorgehensweise in frage stellen. offenbar ist eine art „google
für datenbank“ gewünscht, also ein einziges suchfeld und das
system liefert alles, was irgendwo zum thema gefunden wird.

Natürlich über alle Tabellen und alle Felder - und schon wären wir beim Thema Datawarehouse - oder zumindest dem, was die Marketingabteilung darunter versteht :wink:

Grüße,
Tomh

PS: Ein Loop über die User-Tables, ein anderer über User-Tab-Columns, Select zusammenstöpseln und per Execute-Immediate ausführen - hatte ich doch vor Kurzem erst …