PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Datenbank Suche mit gleich mehr werten



AndyTh
13.07.2023, 09:02
Hallo Szeneboxler ;)

Vielleicht könnt ihr mir weiterhelfen.

Ich habe eine Datenbank und ich will in einer Tabelle nach bestimmten Wörtern suchen. Bei der suche ergibt sich ja folgende SQL Abfrage

SELECT * FROM `video` WHERE `title` REGEXP 'Home'

Das funktioniert einwandfrei, nur wenn ich dutzende Wörter habe nachdem gesucht werden soll, dauert es länger.
Jetzt wollte ich wissen ob ich die suche so erweitern, das bei der Abfrage gleich nach mehr Wörtern gesucht werden kann und ausgeben wird.

Beispiel:
SELECT * FROM `video` WHERE `title` REGEXP 'Home'
SELECT * FROM `video` WHERE `title` REGEXP 'Sweet'
SELECT * FROM `video` WHERE `title` REGEXP 'Christmas'

Leider funktioniert dies nicht und kann nicht bearbeitet werden in der SQL Abfrage. Jetzt war halt meine Idee, ich frage euch dazu und vielleicht kann jemand helfen

fritzi
13.07.2023, 10:37
Na einfach mit AND


SELECT * FROM `TABELLE` WHERE `Feld1` REGEXP '%inhalt%' AND `Feld2` REGEXP '%inhalt%' AND `Feld3` REGEXP '%inhalt%'

2 Tipps dazu:

Nimm für solche Abfragen am besten Pphpmyadmin. Das hat ne Suche und wenn du dir das da zusammenklickst wie du es brauchst dann schmeisst er auch den fertigen Query mit aus den du dann weiterbenutzen kannst.

Oder

nimmt Chatgpt dafür, das hat sich bei sowas als echt hilfreich erwiesen. Also einfach die Struktur reinhauen und nach passenden Querys fragen bzw deine kaputten verbessern lassen

Nimbus
13.07.2023, 11:22
Deine Anfrage benutzt (aktuell) überflüssigerweise "REGEXP".
Für derartige Anfragen ist LIKE in Kombination mit '%' vermutlich geeigneter/performanter.
Also quasi:


WHERE `title` LIKE '%Home%'

Überflüssig ist REGEXP hier einfach, weil du eigentlich keine wirkliche Regular-Expression hinschreibst, sondern einen festen Sub-String.

Lösungsansatz 1: Mehrere Bedingungen mit LIKE statt REGEXP
Prinzipiell könnte man nun einfach mehrere Bedingungen schreiben und verlangen, dass alle eingehalten werden.


SELECT * FROM `video` WHERE
`title` LIKE '%Home%'
AND `title` LIKE '%Sweet%'
AND `title` LIKE '%Christmas%'


Lösungsansatz 2:
Alternativ können wir auch wieder REGEXP aus der Schublade holen und dort mit regulären Ausdrücken beschreiben was gesucht wird. Wie das konkret aussehen könnte hängt aber stark von deinen Anforderungen an das Suchverhalten ab und ist auch nicht super zugänglich, wenn man noch nie damit gearbeitet hat.

Lösungsansatz 3:
Eine Software nutzen, die sich speziell auf das Suchen spezialisiert (z.B. Elasticsearch oder Sphinxsearch). Mit diesen Tools lassen sich schöne Dinge umsetzen. Allerdings könnte ich mir vorstellen, dass das noch etwas zu anspruchsvoll für dich ist.

AndyTh
13.07.2023, 16:35
Hab es nun mit diesem Lösungsansatz versucht...jedoch erhalte ich hier kein ergebnis


SELECT * FROM `video` WHERE
`title` LIKE '%Home%'
AND `title` LIKE '%Sweet%'
AND `title` LIKE '%Christmas%'

Hab es dann mit der phpmyadmin-suche probiert und statt REGEXP, LIKE versucht, nur hier erhalte ich auch kein Ergebniss wenn ich nach zb. Home suche. Daher habe ich bisher Manuel bei jeder suche mit REGEXP machen müssen.

_MySQL lieferte ein leeres Resultat zurück (d.h. null Datensätze). (Die Abfrage dauerte 0.0765 Sekunden.)_

Ansich, habe ich nur 75 Wörter, die in der Tabelle Videos gesucht werden muss und in Spalte Title, aber wenn man mit einer vorgefertigtern SQL Lösung gleich alles finden könnte und auf anhieb löschen, erleichtert es dann doch etwas die arbeit.

Vielleicht mach ich was falsch, daher versuch ichs mit all euren Idee oder...vielleicht hab ich nur nen Punkt oder nen Strich vergessen

fritzi
13.07.2023, 21:09
Hab es dann mit der phpmyadmin-suche probiert und statt REGEXP, LIKE versucht, nur hier erhalte ich auch kein Ergebniss wenn ich nach zb. Home suche. Daher habe ich bisher Manuel bei jeder suche mit REGEXP machen müssen.



Also ich habe keine Ahnung warum du nichts findest aber ein ellenlangen Query bauen mit bis zu 75 Wörtern fühlt sich für mich falsch an. Dann nimm lieber ein Array


SELECT * FROM deineTabelle WHERE Spalte LIKE ANY (ARRAY['%Wert1%', '%Wert2%', '%Wert3%', '%Wert4%', ...])


Generell hätte es mit Like klappen müssen.

Kyle
13.07.2023, 21:31
Volltextsuche wäre für sowas eigentlich das Mittel der Wahl: https://dev.mysql.com/doc/refman/8.0/en/fulltext-boolean.html
Geht allerdings nicht mit jeder Engine.