MySQL Datensätze suchen

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Aphadias
Beiträge: 124
Registriert: Mi 28. Okt 2015, 18:28

MySQL Datensätze suchen

Beitrag von Aphadias »

Hallo da bin ich wieder :oops:

Aktuell baue ich gerade eine Suche(bzw Filter) ein für mein DBGrid.

Dafür benutze ich den Quelltext aktuell

Code: Alles auswählen

SQLQuery1.Close;
     SQLQuery1.SQL.Clear;
     SQLQuery1.SQL.Text:= 'select * from patientenerfassung where Name = :Name';
     SQLQuery1.Params.ParamByName('Name').AsString := esuche.Text;
 
     SQLTransaction1.Active:= True;
     SQLQuery1.Open;


Mein Ziel. 1. Ich möchte gerne ein bestimmtes Wort in der ganzen Tabelle suchen und nicht nur in der angegebenen Spalte. (Bei googel habe ich gelesen das sowas nicht geht. Geht sowas wirklich nicht?)
2. Falls es nicht geht in der ganzen Tabelle zu suchen will ich es wenigstens auf die wichtigsten Spalten begrenzen.

Meine Probleme: 1. Wenn ich ein Wort suche (z.b. Alf) dann zeigt er genau nur das an. Ich möchte aber gerne das er dann mit dazu auch Alfer Alfred Alfrodo Alfredo usw anzeigt... also alles was bis dahin so ähnlich ist. Ich habe es schon mal mit % probiert aber da muss ich ja immer genau definieren nach was die Wildcard gehen soll :(
2. Wie mache ich dass das er dann mehrere Spalten durchsucht?

Würde mich über eure Hilfe freuen :D

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: MySQL Datensätze suchen

Beitrag von Socke »

Aphadias hat geschrieben:Mein Ziel. 1. Ich möchte gerne ein bestimmtes Wort in der ganzen Tabelle suchen und nicht nur in der angegebenen Spalte. (Bei googel habe ich gelesen das sowas nicht geht. Geht sowas wirklich nicht?)

Geht wirklich nicht von Haus aus. Du kannst aber zuerst ein SELECT * FROM patientenerfassung aufrufen und dann über die Feldnamen die Abfrage neu zusammenbauen und die notwendigen Eingabefelder anlegen.
Aphadias hat geschrieben:Meine Probleme: 1. Wenn ich ein Wort suche (z.b. Alf) dann zeigt er genau nur das an. Ich möchte aber gerne das er dann mit dazu auch Alfer Alfred Alfrodo Alfredo usw anzeigt... also alles was bis dahin so ähnlich ist. Ich habe es schon mal mit % probiert aber da muss ich ja immer genau definieren nach was die Wildcard gehen soll :(
2. Wie mache ich dass das er dann mehrere Spalten durchsucht?

Du könntest auch alle Datenbankfelder über die SQL-Funktion concat aneinanderhängen und dann die daraus entstehende Zeichenkette durchsuchen. Wirklich performant ist das aber nicht.

Code: Alles auswählen

SQLQuery1.SQL.Text:= 'select * from patientenerfassung where concat(Name,Spalte2) LIKE :Name';
SQLQuery1.Params.ParamByName('Name').AsString := '%'+esuche.Text+'%';
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

TBug
Beiträge: 177
Registriert: Mi 2. Sep 2015, 11:09
OS, Lazarus, FPC: Lazaurus 2.2.4 FPC 3.2.2
CPU-Target: Windows 32/64bit

Re: MySQL Datensätze suchen

Beitrag von TBug »

Aphadias hat geschrieben:Mein Ziel. 1. Ich möchte gerne ein bestimmtes Wort in der ganzen Tabelle suchen und nicht nur in der angegebenen Spalte. (Bei googel habe ich gelesen das sowas nicht geht. Geht sowas wirklich nicht?)
2. Falls es nicht geht in der ganzen Tabelle zu suchen will ich es wenigstens auf die wichtigsten Spalten begrenzen.


Schau Dir hierzu einmal die MySql-Doku an:
https://dev.mysql.com/doc/refman/5.5/en/fulltext-search.html

Weitere Hilfsmittel sind die MySql-Funktionen MATCH() und AGAINST().


.

Aphadias
Beiträge: 124
Registriert: Mi 28. Okt 2015, 18:28

Re: MySQL Datensätze suchen

Beitrag von Aphadias »

habe es mal probiert... da kommt ein fehler bei mir @socke

MySQLConnect1: Error executing query: Illegal mix of collations (UTF8_bin,NONE) and (latin1_schwedish_ci,COERCIBLE) for operation 'like'

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: MySQL Datensätze suchen

Beitrag von Socke »

Aphadias hat geschrieben:habe es mal probiert... da kommt ein fehler bei mir @socke

MySQLConnect1: Error executing query: Illegal mix of collations (UTF8_bin,NONE) and (latin1_schwedish_ci,COERCIBLE) for operation 'like'

Toll. Dann nehme ich die Fehlermeldung für dich auseinander:
  • Illegal - geht nicht (daher der Fehler)
  • mix - mehrere Dinge wurden vermischt
  • of collations - Es geht collations (deutsch: Alphabetische Sortierung, d.h. wie die Datenbank Zeichenketten interpretiert, sortiert und durchsucht)
  • (UTF8_bin,NONE) and (latin1_schwedish_ci,COERCIBLE) - die beiden Collations
  • for operation 'like' - Fehler ist bei der Operator LIKE
Weiteres Wissen:
LIKE ist ein binärer Operator, das heißt: LIKE hat zwei Operanden, einen vor dem Operator und einen danach. Die Syntax ist also <Operand1> LIKE <Operand2>.

Kombination:
Ein Operand hat die Kollation (UTF8_bin,NONE) und der andere (latin1_schwedish_ci,COERCIBLE).

Lösung:
Beide Operanden sollten die gleiche Collation haben.

Vorgehen:
Analyse des SQL-Statements, der Tabellendefinition (mit welchen Collations wurde die Tabelle angelegt) sowei der Verbindungseinstellungen (welche Collation und welcher Zeichensatz wird von der Verbindung verwendet).

Alternative:
Schau dir den Vorschlag von TBug an; an die Volltextsuche hatte ich gar nicht gedacht. Viuelleicht kommst du damit schneller ans Ziel.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Aphadias
Beiträge: 124
Registriert: Mi 28. Okt 2015, 18:28

Re: MySQL Datensätze suchen

Beitrag von Aphadias »

Danke Socke mittler weile hatte ich den Fehler schon selbst gefunden. Wie auch immer hatte ich nicht gesehen das sich da nen Schwede eingenistet hatte. Deins Funktioniert und das andere schaue ich mir morgen an.

Antworten