My SQL-Query 'Datensatz enthält'

Hallo,

ich bin auf der Suche nach dem SELECT Befehl, der die Datensätze ausgibt, die einen bestimmten Suchbegriff enthalten.

Ich habe mir bisher mit
select a, b, c, FROM tabelle WHERE (a like ‚%suchbegriff%‘) OR (b like ‚%suchbegriff%‘)

Das kann es doch nicht sein, oder?

Wer weiß Rat?

Danke

Maik

select a, b, c, FROM tabelle WHERE (a like ‚%suchbegriff%‘) OR
(b like ‚%suchbegriff%‘)

Das kann es doch nicht sein, oder?

Was ist daran auszusetzen?

Gruß

J.

Hallo,

ich bin auf der Suche nach dem SELECT Befehl…
Ich habe mir bisher mit
select a, b, c, FROM tabelle WHERE (a like ‚%suchbegriff%‘) OR
(b like ‚%suchbegriff%‘)

Das kann es doch nicht sein, oder?

Doch, das kann sein!
Oder alles in „Einem“:
select a, b, c, FROM tabelle WHERE a||b||c|| …
like ‚%suchbegriff%‘

select a, b, c, FROM tabelle WHERE (a like ‚%suchbegriff%‘) OR
(b like ‚%suchbegriff%‘)

Das kann es doch nicht sein, oder?

Was ist daran auszusetzen?

Na daß die höllische Gefahr besteht, bei Erweiterung der Tabelle eine Spalte zu vergessen, die dann nicht mit abgefragt wird. (meine Tabelle ist ein bißchen größer als abc. Eigentlich war ich auf der Suche nach einer spaltenunabhängigen Abfrage…

Grüße

Maik

hab ich auch schon drüber nachgedacht, geht das schneller?

Grüße

Maik

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

hab ich auch schon drüber nachgedacht, geht das schneller?

Ein wenig, da nicht jedes Feld geprüft werden soll, sonder nur das Endergebnis :wink:
Gruß
Dmitri

Na daß die höllische Gefahr besteht, bei Erweiterung der
Tabelle eine Spalte zu vergessen, die dann nicht mit abgefragt
wird. (meine Tabelle ist ein bißchen größer als abc.
Eigentlich war ich auf der Suche nach einer
spaltenunabhängigen Abfrage…

Eine „Splatenunabhängige Abfrage“ kann man (z.B. für Oracle) mit der Hilfe von Dynamic-SQL programmieren:
also Tabellen-Struktur auslesen, Select in einem String zusammen basteln, dann ausführen. Geht in PL/SQL-Procedure oder aus C/C++ Programm.

Na daß die höllische Gefahr besteht, bei Erweiterung der
Tabelle eine Spalte zu vergessen

Hmmm… das stimmt wohl, aber aus Gründen des Arbeitsstils würde ich nicht meine grundsätzliche Anwendungslogik über den Haufen werden… Das was Du beschreibst heißt gemeinhin „bug“ und gehört eigentlich wegprogrammiert.

Eine „Splatenunabhängige Abfrage“ kann man (z.B. für Oracle)
mit der Hilfe von Dynamic-SQL programmieren:
also Tabellen-Struktur auslesen, Select in einem String
zusammen basteln, dann ausführen. Geht in PL/SQL-Procedure
oder aus C/C++ Programm.

Ja, das ist alles sicherlich machbar. Ich frage mich nur: was soll das? Entweder ich weiß, was ich suche, oder ich tue es nicht. Ich kann mir keine sinnvolle Anwendung vorstellen, bei der ich einen Begriff „irgendwo“ gesucht werden würde; als Anwendungsentwickler bin ich in Besitz meines Datenmodells.

Meint jedenfalls

J.

1 Like

Eine „Splatenunabhängige Abfrage“ kann man (z.B. für Oracle)
mit der Hilfe von Dynamic-SQL programmieren:
also Tabellen-Struktur auslesen, Select in einem String
zusammen basteln, dann ausführen. Geht in PL/SQL-Procedure
oder aus C/C++ Programm.

Ja, das ist alles sicherlich machbar. Ich frage mich nur: was
soll das? Entweder ich weiß, was ich suche, oder ich tue es
nicht. Ich kann mir keine sinnvolle Anwendung vorstellen, bei
der ich einen Begriff „irgendwo“ gesucht werden würde; als
Anwendungsentwickler bin ich in Besitz meines Datenmodells.

Ok, ich kann mir eine Anwendung vorstellen, wo ich irgendwo irgendwas suche - z.B. wenn ich ein DB untersuchen soll, ist aber selten zusehen, sonst habe ich nur die Frage beantwortet, das was…
Ob das sinnvoll ist oder nicht soll Maik entscheiden.

Kinder, Kinder,…
Das habe ich nicht gewollt…

Ihr habt Euch schrecklich viel Gedanken gemacht, danke schön, eigentlich wollte ich nur vermeiden, den Änderungswünschen anderer Leute hinterherzuprogrammieren, solche ‚bugs‘ habe ich schon öfter gebracht.
Und das wollte ich halt vermeiden, wenn ich meine Suchabfrage schreibe.
Außerdem dachte ich, daß andere Leute, die richtig große Datenbanken durch ‚SUCHEN‘ bestimmt schnellere Algorithmen zur Hand nehmen…

Ob das sinnvoll ist oder nicht soll Maik entscheiden.

Für mich bestimmt nicht, das ist eine Nummer zu groß, da ich die Datenbank per PHP befrage, muß ich den Query ja nicht immer mit der Hand schreiben.

Dank Euch Beiden

Grüße

Maik

Mit einer derartigen Suche vergibst du dir aber alle Möglichkeiten, über Indizes zu suchen, was schon bei moderaten Datenmengen ins Abseits führt.

Eine echte Volltextsuche ist aber etwas anderes. Entweder die Datenbank bietet sie „schon eingebaut“, wie z.B. MS SQL Server - oder man muss sie sich selber basteln…

Darüber hinaus ist es normalerweise besser, den Benutzer zu „gezieltem“ Suchen anzuleiten. (Also ‚xxx%‘ und nicht ‚%xxx%‘ und dann natürlich Indizes zu verwenden!)

Reinhard

Wie baut man eine Volltextsuche?

Mit einer derartigen Suche vergibst du dir aber alle
Möglichkeiten, über Indizes zu suchen, was schon bei moderaten
Datenmengen ins Abseits führt.

Das habe ich befürchtet…

Eine echte Volltextsuche ist aber etwas anderes. Entweder die
Datenbank bietet sie „schon eingebaut“, wie z.B. MS SQL Server

  • oder man muss sie sich selber basteln…

ach mySQL auch? Und wenn nicht, wie bastelt man dann? Vielleicht hätte ich fragen sollen: Wie baue ich eine Volltextsuche…

Darüber hinaus ist es normalerweise besser, den Benutzer zu
„gezieltem“ Suchen anzuleiten. (Also ‚xxx%‘ und nicht ‚%xxx%‘
und dann natürlich Indizes zu verwenden!)

Stimmt…

Vielleicht hätte ich fragen sollen: Wie baue ich eine
Volltextsuche…

Die übliche Vorgehensweise ist, das man

  1. eine Wort-Zerlegungs-Heuristik entwickelt
  2. eine Tabelle mit zu ignorierenden Wörtern aufbaut
  3. durch die relevanten Felder (i.d.R. Text- und Memo-Felder oder nur bestimmte Felder) der zu indizierende(n) Tabelle(n) geht und dann jedes mit 1. gefundene Wort, was nicht in 2. steht
  4. in einer Tabelle mit dem Verweis auf die Fundstelle ablegt

„Fundstelle“ kann jetzt alles mögliche sein - je nach gewünschter Granularität und Universalität, also z.B.
Tabellenname, Feldname, Position im Feld usw.

Wegen des Datenvolumens wird man wohl nicht mit den echten Namen, sondern mit Schlüsseltabellen arbeiten, so auch z.B.
die eigentlichen Suchwörter getrennt von den Fundstellen ablegen.

Reinhard

1 Like

Dank Dir!

Dank Dir, da werde ich mich mal auf den Hosenboden setzen und was austüfteln…

Grüße

Maik

Kallo Maik,
Kevin Clevenger hat ein kleines Skript für eine „Suchmaschine“ in php geschrieben.
Vielleicht hilft sie Dir ein wenig weiter!
http://px.sklar.com/code.html?code_id=144
Gruß Wolfgang

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]