php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 31.01.2012, 11:27  
Benutzer
 
Registriert seit: 31.01.2012
Beiträge: 47
PHP-Kenntnisse:
Anfänger
Hubba16 befindet sich auf einem aufstrebenden Ast
Standard [Erledigt] Alle Felder über mehrere Tabellen durchsuchen (ohne MyISAM)

Hallo Leute!

Ich hoffe ihr könnt mir weiterhelfen. Ich arbeite oft mit Suchfunktionen, aber die Lösungen sind meist unschön. Über 2.. 3.. Felder: kein Problem! Aber wenn es 20 oder bspw. 100 Felder sind, sieht es schon anders aus. Am einfachsten wäre es mit "SELECT * FROM `db.tabelle` WHERE `spalte1` = wert1 OR `spalte2` = wert2 ...", aber bei so vielen Spalten sehr zeit- und performancelastig. Dann gebe es die Möglichkeit mit MATCH/AGAINST alles abzufangen. Geht leider auch nicht, weil ich mit InnoDB arbeite, um mehrere Tabellen zu verknüpfen. Also fällt der FULLTEXT-Index auch weg. Als letztes würde mir noch einfallen, in einer Schleife alle Felder auszulesen und den String aus Methode 1 dynamisch zu erstellen. Gefällt mir aber auch nicht Langsam und unkontrollierbar Gibt es bessere Varianten als diese?

Viel Grüße,
Hubba16

PS: Ich möchte ein (!) Suchfeld haben, was alle Felder durchsucht und dem Benutzer nicht 100te anbieten
Hubba16 ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 31.01.2012, 11:36  
Erfahrener Benutzer
 
Registriert seit: 01.09.2010
Beiträge: 4.561
PHP-Kenntnisse:
Fortgeschritten
eagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Mensch
Standard

ja - das geht nur mit dieser unschönen Methode - du kannst nicht einfach sagen "such x in der Tabelle y" - nein du musst leider "suche x in Spalte z von Tabelle y" sagen ..

wenn du also 100 Spalten durchsuchen willst - was ziemlich eindeutig auf FAIL-Design hindeutet - dann eben

Code:
select spalte1,spalte2,...., spalte_x from Tabelle_y
WHERE
  spalte1 LIKE '%suchwort%' OR
  spalte2 LIKE '%suchwort%' OR
  spalte3 LIKE '%suchwort%  OR
  spalte_x LIKE '%suchwort%'
__________________
"Irren ist männlich", sprach der Igel und stieg von der Drahtbürste

Geändert von eagle275 (31.01.2012 um 11:39 Uhr).
eagle275 ist offline   Mit Zitat antworten
Alt 31.01.2012, 11:48  
Moderator
 
Registriert seit: 06.06.2008
Beiträge: 4.945
PHP-Kenntnisse:
Fortgeschritten
Wolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer Anblick
Wolla eine Nachricht über ICQ schicken
Standard

Wenn ein einziger Suchbegriff in sehr vielen Spalten vorkommen kann, dann könnte auch das Tabellendesign unstimmig sein. Ich kann mir jedenfalls nicht vorstellen, das man eine Telefonnummer in der Spalte Geburtsdatum suchen muss.

Wenn es für deine Anwendung aber doch sinnvoll ist, dann kommt ggf.so was für dich in Frage:

tabellenstruktur daten
id int autoinc primary key
key varchar(30)
feld varchar(30)
inhalt varchar(255)

Daten zu einem Kunden '4711' sehen dann so aus:
1 4711 vorname Hans
2 4711 name Mustermann
3 4711 strasse Am Bach 1
4 4711 plz 12345
5 4711 ort Musterstadt
6 4812 vorname Max
7 4812 name Müller
... usw

SELECT id,key FROM daten WHERE inhalt = 'Max';

Du kommst dann mit drei Keys aus und einer einzigen Abfrage. das hat allerdings auch gravierende Nachteile, weil du nur eine Spalte vom Typ varchar hast auf die z.B. keine Datumsfunktionen angewendet werden können.
__________________
Warum denkt mein Hund eigentlich immer dann, wenn es an der Tür klingelt, es sei für ihn?
Wolla ist offline   Mit Zitat antworten
Alt 31.01.2012, 11:55  
Erfahrener Benutzer
 
Registriert seit: 13.01.2012
Beiträge: 256
PHP-Kenntnisse:
Anfänger
akretschmer befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Hubba16 Beitrag anzeigen
Hallo Leute!

Ich hoffe ihr könnt mir weiterhelfen. Ich arbeite oft mit Suchfunktionen, aber die Lösungen sind meist unschön. Über 2.. 3.. Felder: kein Problem! Aber wenn es 20 oder bspw. 100 Felder sind, sieht es schon anders aus. Am einfachsten wäre es mit "SELECT * FROM `db.tabelle` WHERE `spalte1` = wert1 OR `spalte2` = wert2 ...", aber bei so vielen Spalten sehr zeit- und performancelastig. Dann gebe es die Möglichkeit mit MATCH/AGAINST alles abzufangen. Geht leider auch nicht, weil ich mit InnoDB arbeite, um mehrere Tabellen zu verknüpfen. Also fällt der FULLTEXT-Index auch weg. Als letztes würde mir noch einfallen, in einer Schleife alle Felder auszulesen und den String aus Methode 1 dynamisch zu erstellen. Gefällt mir aber auch nicht Langsam und unkontrollierbar Gibt es bessere Varianten als diese?

Viel Grüße,
Hubba16

PS: Ich möchte ein (!) Suchfeld haben, was alle Felder durchsucht und dem Benutzer nicht 100te anbieten
So wie Du rangehst willst Du gar keine Datenbank, sondern eine Textdatei. Aber es ist noch nicht zu spät: mach einen Dump und suche mit grep.

Alternativ: besorg Dir ein gescheites Tabellendesign. EAV wäre ein Ansatz, zum Beispiel.

Andreas
akretschmer ist offline   Mit Zitat antworten
Alt 31.01.2012, 12:01  
Benutzer
 
Registriert seit: 31.01.2012
Beiträge: 47
PHP-Kenntnisse:
Anfänger
Hubba16 befindet sich auf einem aufstrebenden Ast
Standard

Danke für die flotte Antwort!
Eine Frage hab' ich noch: Wieso "FAIL-Design"? 100 war nur ein Beispiel und kommt zustande, wenn ich mehrere Tabelle verknüpfe (Redundanz vermeiden )

Hier nochmal ein Beispiel: Webshop

Ein Artikel hat eine Beschreibung, einen Artikelname, einen Hersteller, dessen Webseite, und und und...

Wo ist der Gedanke falsch? Z.B. den Hersteller lager ich aus. Nun habe ich aber ein (!) Suchfeld und das soll mir Artikelbeschreibung, Hersteller etc. durchsuchen.

Geändert von Hubba16 (31.01.2012 um 12:04 Uhr).
Hubba16 ist offline   Mit Zitat antworten
Alt 31.01.2012, 12:05  
Erfahrener Benutzer
 
Registriert seit: 13.01.2012
Beiträge: 256
PHP-Kenntnisse:
Anfänger
akretschmer befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Hubba16 Beitrag anzeigen
Danke für die flotte Antwort!
Eine Frage hab' ich noch: Wieso "FAIL-Design"? 100 war nur ein Beispiel und kommt zustande, wenn ich mehrere Tabelle verknüpfe (Redundanz vermeiden )

Hier nochmal ein Beispiel: Webshop

Ein Artikel hat eine Beschreibung, einen Artikelname, einen Hersteller, dessen Webseite, und und und...

Wo ist der Gedanke falsch? Z.B. den Hersteller lager ich aus. Nun habe ich aber ein (!) Suchfeld und das soll mir Artikelbeschreibung, Hersteller etc. durchsuchen.
Weil das nicht skaliert. Ich sehe @work täglich genug solcher Kunstrukte, glaub mir ...

Andreas
akretschmer ist offline   Mit Zitat antworten
Alt 31.01.2012, 12:06  
Benutzer
 
Registriert seit: 31.01.2012
Beiträge: 47
PHP-Kenntnisse:
Anfänger
Hubba16 befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von akretschmer Beitrag anzeigen
Weil das nicht skaliert. Ich sehe @work täglich genug solcher Kunstrukte, glaub mir ...

Andreas
Wie meinst du das?
Hubba16 ist offline   Mit Zitat antworten
Alt 31.01.2012, 12:08  
Erfahrener Benutzer
 
Registriert seit: 13.01.2012
Beiträge: 256
PHP-Kenntnisse:
Anfänger
akretschmer befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Hubba16 Beitrag anzeigen
Wie meinst du das?
Deine Daten wachsen, Deine Applikation wächst, der Frust der Anwender auch.


Andreas
akretschmer ist offline   Mit Zitat antworten
Alt 31.01.2012, 12:11  
Benutzer
 
Registriert seit: 31.01.2012
Beiträge: 47
PHP-Kenntnisse:
Anfänger
Hubba16 befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von akretschmer Beitrag anzeigen
Deine Daten wachsen, Deine Applikation wächst, der Frust der Anwender auch.


Andreas
Ja ok, aber ich kann Benutzern wohl kaum für jedes Feld eine Suchfunktion anbieten?! Jeder Nutzer ist es gewohnt ein Suchfeld für alles zu haben und dann eventuell z.B. links eine Suchfunktion für z.B. die Größe des Artikels. Verstanden was ich meine?
Hubba16 ist offline   Mit Zitat antworten
Alt 31.01.2012, 12:40  
Erfahrener Benutzer
 
Registriert seit: 01.09.2010
Beiträge: 4.561
PHP-Kenntnisse:
Fortgeschritten
eagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Mensch
Standard

nicht zwingend ...du gehst wohl vom google - Feld aus ... gewöhnlich weiß der Anwender schon, ob er einen Hersteller sucht - und wenn ich zum Beispiel von professionellen Seiten wie notebooksbilliger.de ausgehe, da hast du auch ein Suchfeld für den Hersteller, eines für die Bildschirmgröße und so weiter ...

den Ausweg aus dem Dilemma hat dir Wolla bereits gezeigt

Lege deine Datentabelle in Form einer Key-Value-Tabelle an .. dafür ist SQL zwar eigentlich nicht so gedacht, macht es aber ganz wunderbar ...

denn dann stehen ALLE Values in einer Spalte und die lässt sich wunderbar durchsuchen - und wenn du die Ergebnisse holst, siehst du anhand des Keys, um was für einen Wert es sich bei value eigentlich handelt - der key kann dann auch gern ein Foreign key auf eine Tabelle mit den Schlüsselworten sein ... und als 3ten Wert - neben der ID speicherst du in der Tabelle noch die Produkt-ID , so dass du auch gleich "siehst", welches Produkt die gewünschte Bedingung "Suchbegriff" erfüllt
__________________
"Irren ist männlich", sprach der Igel und stieg von der Drahtbürste
eagle275 ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
MySQL Statement über mehrere Tabellen scoops Datenbanken 4 15.12.2010 21:25
[Erledigt] JOIN über 3 Tabellen + 2 m:n Tabellen dennis81 Datenbanken 7 08.12.2010 15:36
Datenbankabfrage über 3 Tabellen typhoch2 Datenbanken 2 05.12.2010 22:08
[Erledigt] SELECT über zwei Tabellen (INNER JOIN) und Ausgabe von verglichener a_i ID MeckiDerIgel Datenbanken 6 09.11.2010 01:31
MySQL-Update über mehrere Tabellen djlars PHP Tipps 2010 2 02.11.2010 16:47
Abfrage von 3 Tabellen über odbc?! pfump Datenbanken 11 27.10.2010 08:58
[Erledigt] mehrere Tabellen über PHP script aus Datenbank auslesen alphabetisch... Janela Datenbanken 17 02.09.2010 20:18
[Erledigt] Select Abfrage über 2 Tabellen bringt keine Ausgabe clamber Datenbanken 4 03.03.2010 15:25
gelöst: Datenbankabfrage über 3 Tabellen lord_icon Datenbanken 0 12.10.2009 00:38
abfrage über mehrere tabellen mit einer bedingung DarkThunder PHP Tipps 2007 6 15.04.2007 17:13
SELECT über zwei Tabellen KingCrunch Datenbanken 9 23.03.2007 04:01
Update über zwei Tabellen tekknotrip Datenbanken 2 26.02.2007 16:25
suche über 8 tabellen PHP Tipps 2004 3 03.09.2004 12:48
Abfrage über 3 Tabellen PHP Tipps 2004 3 31.07.2004 22:34
[Erledigt] Join für Select Count(`id`)-Abfrage über 4 Tabellen Datenbanken 4 10.07.2004 18:32

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
datentabelle mit suchfeld durchsuchen, tabellen durchsuchen, javascript tabelle durchsuchen

Alle Zeitangaben in WEZ +2. Es ist jetzt 16:53 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum