Durchsuchen einer Datenbank
Manfred
- datenbank
Hallo Leute!
Ich habe ein kleines Problem mit dem durchsuchen einer Datenbank.
Das Programm zum Durchsuchen ist in PHP geschrieben und die Datenbank ist MySQL. Einzelne Tabellen zu durchsuchen ist kein Problem.
Das Problem besteht aber darin, daß ich eine Tabelle nach Namen und Adressen durchsuchen möchte. und eine oder mehrere Tabellen z.B. was für ein Auto er hat und was für ein Motorad er hat.
Das Durchsuchen funktioniert bei einem kleinen Datenbestand. ´Leider umfasst die Adressenliste gut 1000 Einträge und die Liste mit den Autos und den Motorräder mehrere Tausend Datensätze.
Weiters müssen die Datenfelder nach Bruchstücken durchsucht werden wie z.B. Opel oder VW.
Wie kann ich hier das Problem beheben. Gibt es dafür eine MySQL Funktion habe es mit Joins schon probiert, hat aber nicht ganz so geklappt wie ich wollte.
Zur Zeit arbeite ich mit Schleifen in PHP was die Performance sehr einschränkt.
Bitte um Hilfe
Manfred
Hallo!
Das Problem besteht aber darin, daß ich eine Tabelle nach Namen und Adressen durchsuchen möchte. und eine oder mehrere Tabellen z.B. was für ein Auto er hat und was für ein Motorad er hat.
Wenn die Datenbank einigermaßen gescheit aufgebaut ist, sollte das mit SQL möglich sein. Poste mal die Tabellenstruktur.
mfg
frafu
Hallo!
Das Problem besteht aber darin, daß ich eine Tabelle nach Namen und Adressen durchsuchen möchte. und eine oder mehrere Tabellen z.B. was für ein Auto er hat und was für ein Motorad er hat.
Wenn die Datenbank einigermaßen gescheit aufgebaut ist, sollte das mit SQL möglich sein. Poste mal die Tabellenstruktur.
mfg
frafuHallo!
Tabelle 1: Adressen
id benutzernummer name
1 1234 Max Müller
2 6789 Michael Meier
Tabelle 2: Autos
id benutzernummer Auto Türen
1 1234 Opel Astra 4
2 1234 VW Polo 2
3 6789 Toyota Corolla 4
4 6789 VW Golf 2
5 6789 VW Polo 4
Tabelle 3: Motorräder
id benutzernummer Motorrad Beiwagen
Ähnlich wie die der Autos
Die Zugehörigkeit wird über die benutzernummer ermittelt.
Über die ID ist es leider nicht möglich, da die Tabelle Autos und Motorräder nicht von uns erstellt werden und wir diese einfach übernehmen (müssen ca. 30.000 Datensätze/Tabelle).
Aus der Tabelle sollen z.B. Alle VW besitzer ermittelt werden und die Adressen angezeigt werden. Bei dieser Abfrage soll das Auto auf VW überprüft werden. Wenn das Auto VW enthält ist der Besitzer ein VW besitzer und wird angezeigt.
Weiters könnten aber alle VW und Opel Besitzer gesucht werden oder alle die einen VW Polo mit 2 Türen besitzen.
Wenn dies mit SQL möglich ist, wäre mit das sehr recht, da meine Lösung in PHP an der Grenze der Performance ist.
mfg Manfred
Hallo!
Tabelle 1: Adressen
id benutzernummer name
1 1234 Max Müller
2 6789 Michael MeierTabelle 2: Autos
id benutzernummer Auto Türen
1 1234 Opel Astra 4
2 1234 VW Polo 2
3 6789 Toyota Corolla 4
4 6789 VW Golf 2
5 6789 VW Polo 4
Einfacher würde es werden, wenn man die Spalte Auto auf zwei Spalten aufteilen könnte. Nämlich in Marke und Typ. Dann ist die Abfrage wesentlich einfacher.
Bist du sicher, dass direkt in der Tabelle Autos die Referenz auf den Benutzer gespeichert ist? Was ist, wenn 2 Personen einen 4 türigen VW Polo haben? Dann steht in der Tabelle Autos wirklich zweimal VW Polo 4 türig?
Tabelle 3: Motorräder
id benutzernummer Motorrad Beiwagen
Ähnlich wie die der AutosDie Zugehörigkeit wird über die benutzernummer ermittelt.
Über die ID ist es leider nicht möglich, da die Tabelle Autos und Motorräder nicht von uns erstellt werden und wir diese einfach übernehmen (müssen ca. 30.000 Datensätze/Tabelle).Aus der Tabelle sollen z.B. Alle VW besitzer ermittelt werden und die Adressen angezeigt werden. Bei dieser Abfrage soll das Auto auf VW überprüft werden. Wenn das Auto VW enthält ist der Besitzer ein VW besitzer und wird angezeigt.
Ist sichergestellt, dass die Bezeichnung eines VWs immer mit "VW" beginnt? Wenn ja dann:
SELECT adressen.* FROM adressen,autos WHERE autos.auto like "VW%" AND autos.benutzernummer=adressen.benutzernummer
Weiters könnten aber alle VW und Opel Besitzer gesucht werden oder alle die einen VW Polo mit 2 Türen besitzen.
VW und Opel Besitzer:
SELECT adressen.* FROM adressen,autos WHERE (autos.auto like "VW%" OR autos.auto like "Opel%") AND autos.benutzernummer=adressen.benutzernummer
VW Polo mit 2 Türen:
SELECT adressen.* FROM adressen,autos WHERE autos.auto ="VW Polo" AND autos.türen=2 AND autos.benutzernummer=adressen.benutzernummer
mfg
frafu
Hallo!
Die Daten in der Datenbank sind einheitlich.
Die Beispiele mit den Autos und Motorräder sind zwar erfunden, aber die Tabellen für die Adresslisten haben eine ähnliche Struktur.
Deine Beispiele sehen Sehr gut aus. Ich werde sie gleich ausprobieren und hoffe, daß die Performance gut ist. Damit wird die Suche im Datenbestand für mich erleichtert, da ich nicht immer eine Schleife dafür brauche.
Danke für die Hilfe!
Manfred
Hallo!
Eine Frage habe ich noch.
Das Ergebnis in deinen Beispielen liefert mir das Gewünschte Ergebnis, lemider wird für jedes gefundene Auto ein Datensatz erzeugt. Ist es möglich, daß die Adresse nur einmal angezeigt wird?
mfg Manfred
Hallo!»» Hallo!
Eine Frage habe ich noch.
Das Ergebnis in deinen Beispielen liefert mir das Gewünschte Ergebnis, lemider wird für jedes gefundene Auto ein Datensatz erzeugt. Ist es möglich, daß die Adresse nur einmal angezeigt wird?mfg Manfred
Ein bisserl was wirst schon selber machen müssen. :-) Schau dir mal GroupBy an.
mfg
frafu
yo,
Ein bisserl was wirst schon selber machen müssen. :-) Schau dir mal GroupBy an.
GROUP BY wird ihn eher in die falsche richtung weisen, nämlich dann, wenn er anfängt auch spalten der tabelle autos oder motorräder mit ausgeben will. und im falle, falls es bei der ausgabe der asdresstabelle bleibt würde ich zu einem DISTINCT anstelle eines GROUP BY raten.
der andere punkt ist der, dass ich die JOIN bedingung in der WHERE klausel am anfang nehmen würde. ich bin mir nicht sicher, wie mysql die abfrage optmiert, aber die reihenfolge könnte sich erheblich auf die performance ausführen. zum anderen sollte noch ein geeigneter index gestzt werden.
Ila
Moin,
http://php-faq.de/q/q-mysql-volltextsuche.html
Viel Spaß damit!
ToMIRL