SQL Querry über mehrere Spalten

Status
Nicht offen für weitere Antworten.

multiholle

Aktives Mitglied
Ich möchte in meiner Datenbank über eine Anfrage einen Datensatz an anhand diesen Strings finden: "ärzte best of westerland". Die Datenbank besitzt die Spalten "Künstler", "Album", "Titel", ...

Das Problem ist, das ich nicht eine Spalte nach dem String fragen kann. Der Datensatz muss in irgend einer Spalte "ärzte" in einer anderen, oder der gleichen "best" enthalten und so weiter.

Wie formuliere ich dafür eine korrekte SQL anfrage? Hier mein Ansatz:
[highlight="Java"]
public Vector<MP3File> getSongs(String query) {
try {
query = "%" + query.replaceAll(" ", "%") + "%";
System.out.println(query);
Vector<MP3File> songs = new Vector<MP3File>();
stmtSearchSong.clearParameters();
stmtSearchSong.setString(1, query);
stmtSearchSong.setString(2, query);
stmtSearchSong.setString(3, query);
stmtSearchSong.execute();
ResultSet results = stmtSearchSong.getResultSet();
while (results.next()) {
MP3File newSong = new MP3File(results.getString("ARTIST"),
results.getString("ALBUM"),
results.getString("TRACK"),
results.getString("TITLE"),
results.getString("DATE"),
results.getString("PATH"));
songs.add(newSong);
}
return songs;
}
catch (SQLException e) {
e.printStackTrace();
}
return null;
}

private final String strSearchSong =
"SELECT * FROM MEDIA " +
"WHERE UPPER(ALBUM) LIKE UPPER(?) " +
"OR UPPER(ARTIST) LIKE UPPER(?) " +
"OR UPPER(TITLE) LIKE UPPER(?) ";
[/highlight]
 
S

SlaterB

Gast
die Felder in der DB solltest du zu einem String konkatenieren,
aber die LIKE-Anfragen müssen wohl immer noch einzeln stattfinden
WHERE (sumString Like ?) or (sumString Like ?) or ..

das Upper für die Suchstrings kannst du dir im SQL sparen und die Parameter gleich passend übergeben, % musst eh drankleben

den SumString möglichst nur einmal definieren, kennst du eine View? damit ginge das vielleicht

SELECT id FROM
(SELECT id, UPPER(a+b+c+d) as sumString FROM MEDIA)
WHERE (sumString Like ?) or (sumString Like ?) or ..

oder ähnlich, wie man Strings zusammenfügt und Views bildet ist evtl. DB-abhängig
 

sparrow

Top Contributor
Spontaner Einfall:

Mach eine "Suchspalte" in der du den Inhalt der zu durchsuchenden Spalten nochmals schreibst. Dann kannst du in eienr Abfrage diese Spalte prüfen.

Künstler: Die Ärzte
Album: Irgendwas mit Hamstern
Titel: Osterland
Suchspalte: Die Ärzte Irgendwas mit Hamstern Osterland

Wenn du jetzt nach Ärzte und Osterland suchen würdest:

Code:
SELECT * FROM table 
WHERE suchspalte LIKE "%Ärzte%" 
AND suchspalte LIKE "%Osterland%";
 

multiholle

Aktives Mitglied
@sparrow
das wäre eine idee, ist aber leider nicht so schön in der umsetzung. da ich so ziemlich alle spalten durchsuchen will, müsste ich die daten doppelt halten. das gefällt mir nicht.

@SlaterB
was meinst du mit "view"? ich nutze die embedded derby datenbank. wie mach ich das da?
 

sparrow

Top Contributor
Die Lösung von SlaterB ist von der Art her mit meiner identisch.

Stell dir ein View wie eine "gespeicherte Abfrage" der Datenbank vor.
In der Sicht definierst du dann entsprechend die Abfrage die dir für jeden Datensatz alle durchsuchbaren Felder in einem Feld zusammen fasst und durchsuchst dann eben diese Datensätze mit LIKE.

Sicht (Datenbank) ? Wikipedia

Unabhängig davon müsstest (als View oder direkt in der Abfrage) alle Spalten die du durchsuchen willst in eine zusammenführen.

Gruß
Sparrow
 
Zuletzt bearbeitet:

multiholle

Aktives Mitglied
Wenn ich mir eine View definiere, dann habe ich eine "Suchspalte" in der alle Spalten in einer bestimmten Reihenfolge aufgeführt werden. Das Problem ist, dass die Suchanfrage nicht in dieser Reihenfolge gestellt werden muss.

"ärzte bäst of westerland"
"westerland ärzte best of"
"best of ärzte westerland"

Dann müsste ich für jede Kombination eine eigene "Suchspalte" definieren :/ Oder gibt es eine einfachere Lösung? Kann man der Datenbank evtl. eine Art Algorithmus übergeben, mit dem die Anfrage ausgewertet wird?
 
S

SlaterB

Gast
anfangs hieß es 'in irgend einer Spalte "ärzte", in einer anderen, oder der gleichen "best"'
von Reihenfolge keine Rede,

du sollst doch eh jedes Wort einzeln suchen, was spielt da die Reihenfolge der zusammengefügten Spalten für eine Rolle?
 

multiholle

Aktives Mitglied
Ok, da habe ich mit etwas unklar ausgedrückt. Wenn ich jedes Wort einzeln afrage, bekomme ich aber nicht ein Ergebnis, welches alle Wörter enthält.
 
S

SlaterB

Gast
man kann die Einzelabfragen mit ODER oder mit UND verknüpfen..,
oder du musst die Frage noch genauer stellen, z.B. ein Beispiel
 

multiholle

Aktives Mitglied
Folgende Datenbank:
Code:
Artist		Album				Title
-------------------------------------------------
Adam Green	Friends Of Mine			Hard To Be A Girl
Burial 		Untrue				Archangel
Cartridge	Fractures			1925
Wenn ich jetzt den Song von Adam Green haben will sollen folgende Suchanfragen das gleiche Ergebnis liefern:
Code:
green friends hard girl
hard girl adam
hard to be friends adam
friends of mine adam green girl
...

Wie mache ich das am besten?
 
S

SlaterB

Gast
wie in Antwort 1 und 2 vorgeschlagen abgesehen von AND statt OR
oder aus welchem Grunde sollten die Vorschläge nicht genügen?

am allerbesten wäre evtl. eine spezielles Framewort für sowas,
Apache Lucene - Overview
keine Ahnung ob das einbaubar ist und auf mehrere Spalten gleichzeitig suchen kann und nach allen Begriffen usw
 

sparrow

Top Contributor
Ich weiß nicht mit welcher Datenbank du arbeitest aber hier mal ein Beispiel mit PostgreSQL.
Mit der Reihenfolge der Wörter in der Spalte hat das ganze nichts zu tun:

Code:
postgres=# SELECT * FROM musik;
      band       |   album   |       title       
-----------------+-----------+-------------------
 Die Ärzte       | Best of   | Osterland
 Die Hoten Tosen | Open Gang | Ausverkauft
 Depeche Mode    | Violator  | Enjoy the Silence
(3 Zeilen)

Zeit: 0,568 ms
postgres=# SELECT band, album, title, band || ' ' || album || ' ' || title AS suchspalte FROM musik;
      band       |   album   |       title       |               suchspalte                
-----------------+-----------+-------------------+-----------------------------------------
 Die Ärzte       | Best of   | Osterland         | Die Ärzte Best of Osterland
 Die Hoten Tosen | Open Gang | Ausverkauft       | Die Hoten Tosen Open Gang Ausverkauft
 Depeche Mode    | Violator  | Enjoy the Silence | Depeche Mode Violator Enjoy the Silence
(3 Zeilen)

Zeit: 0,642 ms
postgres=# CREATE VIEW musik_view AS SELECT band, album, title, band || ' ' || album || ' ' || title AS suchspalte FROM musik;
CREATE VIEW
Zeit: 3,418 ms
postgres=# SELECT * FROM musik_view;
      band       |   album   |       title       |               suchspalte                
-----------------+-----------+-------------------+-----------------------------------------
 Die Ärzte       | Best of   | Osterland         | Die Ärzte Best of Osterland
 Die Hoten Tosen | Open Gang | Ausverkauft       | Die Hoten Tosen Open Gang Ausverkauft
 Depeche Mode    | Violator  | Enjoy the Silence | Depeche Mode Violator Enjoy the Silence
(3 Zeilen)

Zeit: 1,223 ms
postgres=# SELECT * FROM musik_view WHERE suchspalte LIKE '%Osterland%' AND suchspalte LIKE '%Ärzte%';
   band    |  album  |   title   |         suchspalte          
-----------+---------+-----------+-----------------------------
 Die Ärzte | Best of | Osterland | Die Ärzte Best of Osterland
(1 Zeile)

Zeit: 1,352 ms
postgres=# SELECT * FROM musik_view WHERE suchspalte LIKE '%Osterland%' AND suchspalte LIKE '%Depeche%';
 band | album | title | suchspalte 
------+-------+-------+------------
(0 Zeilen)

Zeit: 0,821 ms
postgres=# SELECT * FROM musik_view WHERE suchspalte LIKE '%Die%';
      band       |   album   |    title    |              suchspalte               
-----------------+-----------+-------------+---------------------------------------
 Die Ärzte       | Best of   | Osterland   | Die Ärzte Best of Osterland
 Die Hoten Tosen | Open Gang | Ausverkauft | Die Hoten Tosen Open Gang Ausverkauft
(2 Zeilen)

Zeit: 0,790 ms
postgres=#

Der Teil band || ' ' || album || ' ' || title AS suchspalte fügt den Inhalt der Spalten Band, Album und Titel zusammen, jeweils mit einem Leerzeichen dazwischen. Das geht bei PostgreSQL auf jeden Fall so, wie es bei anderen Datenbanken ist weiss icht nicht. Vielleicht gibt es da eine Concat-Version.

Ich hoffe das war verständlich ;)

Sparrow
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Hibernate - Querry mit Eingrenzung und Order; liefert nichts zurück Datenbankprogrammierung 4
ven000m SQL Querry wird nicht abgesetzt, da vorher underlined! Datenbankprogrammierung 8
W MySQL-Connector funktioniert nicht über WLAN -> MacOS Datenbankprogrammierung 10
btwX28 mysql abfrage über phpmyadmin Datenbankprogrammierung 8
Beginner22 Zugriff auf Datenbank aus Java über mariadb Datenbankprogrammierung 3
tom.j85 Objekt in OneToOne Beziehung über http request anzeigen lassen Datenbankprogrammierung 3
N Java Abfrage über GUI, Daten hinzufügen Datenbankprogrammierung 54
C Datenbank anlegen und über eine Website mit Daten füllen? Datenbankprogrammierung 25
J Nur CRUD über Datenbank Klasse, oder auch mehr ? Datenbankprogrammierung 2
M MySQL Passwort Clientseitig ändern und über Button ausführen Datenbankprogrammierung 0
F MySQL Einfügen von Datensätzen über Java Datenbankprogrammierung 8
L Oracle Datenbank über Java aufrufen Datenbankprogrammierung 29
K HSQLDB .sql Script Aufruf über Java Datenbankprogrammierung 7
D JPQL- Query über mehrere Tabellen Datenbankprogrammierung 7
B MySQL: Port ändern über GUI? Wo und wie Port ändern? Datenbankprogrammierung 0
J mySQL- Java Application - Zugriff über Internet Datenbankprogrammierung 3
M Feedback für neues Buch über "Java und Datenbanken" erwünscht Datenbankprogrammierung 8
L H2 Embedded H2 Datenbank über Netzwerk zugreifen? Datenbankprogrammierung 0
W SQL-Statement Datenbankabfrage über Yahoo Datenbankprogrammierung 0
J wie mit resultset.next() über Datensätze iterieren? Datenbankprogrammierung 15
dat_vin JavaFX Datenbankverbindung über JPA und MySQL Error Datenbankprogrammierung 0
E Wie kann man mit einer ID-Spalte über eine Parameterübergabe auf eine Seite verweisen? Datenbankprogrammierung 17
I JPA - BoneCP über die persistence.xml konfigurieren Datenbankprogrammierung 0
AssELAss Oracle Wildcard-Suche über zwei Felder Datenbankprogrammierung 5
M MySQL Insert über mehrere Tabellen Datenbankprogrammierung 7
K SQL Befehle über java Oberfläche Datenbankprogrammierung 4
S MySQL Abfrage über mehrere Tabellen + Einträge werden überschrieben Datenbankprogrammierung 1
G JDBC Connect nur über SID fehlerfrei möglich Datenbankprogrammierung 2
M Information über Änderungen Datenbankprogrammierung 8
F MySQL Daten ändern über Java Datenbankprogrammierung 3
C SQL-Statement SELECT über 3 Tabellen Datenbankprogrammierung 5
I MySQL Vergleich über mehrere Tabellen! Join? Datenbankprogrammierung 6
B DB Anbindung über Tomcat Datenbankprogrammierung 16
S ID Wert von Insert über jdbcTemplate.update Datenbankprogrammierung 3
S mySQL Manipulation über JavaServer Faces (Tutorial gesucht) Datenbankprogrammierung 10
C Mit jsp über Java eine DB Abfrage durchführen --> java.lang.ClassNotFoundException Datenbankprogrammierung 4
C H2 über DynDNS Datenbankprogrammierung 2
D Frage zu INSERTS über mehrere Datenbanktabellen Datenbankprogrammierung 3
J MySQL Verbindung über JDBC scheitert immer Datenbankprogrammierung 2
C Datenbanklogin über JSF Datenbankprogrammierung 3
G JOIN Abfrage über mehrere Tabellen Datenbankprogrammierung 15
O MySQL sql Datei einzelner Tabellen erzeugen (über Java Programm) Datenbankprogrammierung 6
J mit java in access DB über odbc/jdbc Datenbankprogrammierung 2
G SQL Abfrage über mehrere Tabellen Datenbankprogrammierung 28
1 Aufruf einer View über Java Gui Datenbankprogrammierung 5
S SQL inner join bei >10 Tabellen über 2 Variablen Datenbankprogrammierung 2
M Messenger über MySQL sinnvoll? Datenbankprogrammierung 7
N Wie kann ich Zugriff auf eine MS Access DB (mit JDBC) über Netzwerk erreichen? Datenbankprogrammierung 7
T DB2 delete/update über 2 Tabellen Datenbankprogrammierung 2
klattiator Aufklärung über OR-Mapping Datenbankprogrammierung 7
B Mysql über jdbc sehr langsam Datenbankprogrammierung 4
X Abfrage über 2 Tabellen mit Tücken Datenbankprogrammierung 3
M Auswerten über drei Tabellen Datenbankprogrammierung 2
O Mittelwert über mehrere Zeilen Datenbankprogrammierung 11
P Benötige etwas Hilfe bei Datanbankabfrage über Java Datenbankprogrammierung 3
R Abfrage über Zwischentabellen? Datenbankprogrammierung 2
N Unbekannte Datenbank über Metadaten auslesen? Datenbankprogrammierung 9
S Select über mehrere Datenbanksysteme Datenbankprogrammierung 14
S Mysql abfrage über 2 tabellen. Datenbankprogrammierung 10
U Java und Mysql Problem über 24:00:00 Stunden Datenbankprogrammierung 4
M MySQL-Datenbank über Java ansprechen Datenbankprogrammierung 5
W Zwei Fragen über JDBC und MySQL Datenbankprogrammierung 2
G Funktionen/Arbeitsschritte über Menü sinnvoll aufteilen Datenbankprogrammierung 3
G JDBC über Proxy Datenbankprogrammierung 21
C Hausarbeit -> Datenbankzugriff über JDBC Datenbankprogrammierung 2
F Login per JDBC über PHP-Skript? Datenbankprogrammierung 4
R Kann man mit JDBC auch über das Internet auf DB zugreifen? Datenbankprogrammierung 4
B Hilfe! Problem bei Verbindung über JDBC/ODBC Datenbankprogrammierung 4
S Java Verbindung über das Netzwerk Datenbankprogrammierung 4
N Abfrage über zwei Datenbanken Datenbankprogrammierung 9
V Werte über Konsole in Datenbank schreiben Datenbankprogrammierung 2
D Datenbank zugriff über Client/Server Datenbankprogrammierung 4
V Access-Transaktion über jdbc:odbc Datenbankprogrammierung 4
G Infos über implementierungsspezifische Aspekte d. DB -Progr. Datenbankprogrammierung 2
T Problem bei MySQL Connect über JavaBean Datenbankprogrammierung 3
OnDemand Daten auf mehrere Tabellen aufteilen oder Spalten nutzen Datenbankprogrammierung 2
J Mehrere WHERE Werte benutzen Datenbankprogrammierung 2
G ID zuweisung eines TerminKalenders (mehrere Kalender) Datenbankprogrammierung 8
K Mehrere Benutzer Datenbankprogrammierung 6
O HSQLDB Eine Entität, mehrere Tabellen Datenbankprogrammierung 8
S Abfrage von Gruppentickets(Mehrere Resorts an einem Tag) Datenbankprogrammierung 1
E Mehrere Tabellenspalten mit INNER JOIN verknüpfen Datenbankprogrammierung 1
Androbin [Serializing] Mehrere Objekte in einer einzigen Datei speichern Datenbankprogrammierung 1
S HSQLDB Mehrere PreparedStatements ausführen Datenbankprogrammierung 3
J Mehrere Inserts bei Fehlschlag abbrechen Datenbankprogrammierung 2
P Mit Hibernate mehrere Datensätze löschen Datenbankprogrammierung 7
F [SQLite] Mehrere Datensätze einfügen Datenbankprogrammierung 12
M DB: Mehrere Zeilen in einer Zeile zusammenführen Datenbankprogrammierung 10
U Nur den ersten Datensatz löschen wenn mehrere gleiche da sind Datenbankprogrammierung 2
O eine Tabelle hat mehrere PrimKey mit dem selben Wert Datenbankprogrammierung 9
T Theoriefrage : mehrere User vs gleichen Datensatz Datenbankprogrammierung 4
N mehrere Abfragen nacheinander wie mit MS Access mit JAVA Datenbankprogrammierung 3
G Mehrere Tabellen abfragen Datenbankprogrammierung 7
D mehrere Datensätze in ein Listenfeld Datenbankprogrammierung 2
T JAVA JDBC mehrere Anfragen direkt hintereinander ausführen Datenbankprogrammierung 2
M Mehrere Tabellen zusammenführen Datenbankprogrammierung 4
W Prepared Statement mehrere Zeichenketten Datenbankprogrammierung 4
F Mehrere unterschiedliche ResultSets Datenbankprogrammierung 7
P [Hibernate] Mehrere Keys in einem <set> Datenbankprogrammierung 11
G Insert-anweisung mehrere Varianten eine geht Datenbankprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben