Manfred: Durchsuchen einer 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

  1. 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

    1. 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

      1. Hallo!

        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

        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 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.

        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

        1. 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

        2. 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

          1. 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

            1. 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

    2. Moin,
      http://php-faq.de/q/q-mysql-volltextsuche.html
      Viel Spaß damit!
      ToMIRL