[MySQL 3.23.X] Join-Problem bei Suche über 2(3?) Tabellen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [MySQL 3.23.X] Join-Problem bei Suche über 2(3?) Tabellen

    Hallo,
    Ich habe folgende Datenstruktur/Tabellen für eine Sammlung von 100en Projekten von immer 2 Partnern und deren Daten.

    projekt:
    id, id_partner1, id_partner2, proj_name, beginn, ende, ...

    partner:
    id, name, vorname

    projekt und partner sind über partner.id verknüpft.
    Ich suche in der DB z.B. die daten aus projekt in denen ein Partner partner1 oder partner2 ist. Die Ausgabe sollte, wenn man nach Meier sucht, dann etwa so aussehen:

    proj_name | Name Partner1 | Name Partner2
    -----------------------------------------------------------
    P1 |Bachmann |Meier
    P45 |Meier |Schulz
    P677 |Becker |Meier

    Bisher habe ich das auf die Schnelle mit mehreren Selects in php gemacht, indem ich mir aus der Tabelle partner alle ID's und Daten hole und in ein Array schiebe. Danach läuft ein einfacher SELECT mit der id des Gesuchten (WHERE projekt.id_partner1 = '$id' OR projekt.id_partner2 = '$id') über die Tabelle projekt und mit dem Array ersetze ich die Partner-ID's der Ausgabe.
    Das müsste aber auch direkt in einem Select realisierbar sein, mir fehlt aber der Ansatz. Mit einem Join kann ich zwar nach allen Datensätzen suchen, in denen Herr Meier Partner1 ODER Partner2 ist, eine Suche über beide Partner klappt nicht.
    Ich hab auch versucht, mittels 2 ALIAS die Tabelle partner zu 2 virtuellen p1 und p2 verdoppeln, muss da aber was falsch machen...
    Mit Google und Forensuche komm ich auch nicht mehr weiter. Ich schätze, es ist nicht schwer, wenn man die richtige Idee hat.

    MfG
    Marco.

  • #2
    Ich hab auch versucht, mittels 2 ALIAS die Tabelle partner zu 2 virtuellen p1 und p2 verdoppeln, muss da aber was falsch machen...
    Der Ansatz ist schon mal gut und geht in die richtige Richtung.
    Wie sieht denn Deine Abfrage bisher aus?
    Fehlermeldungen?

    Ich könnte Dir jetzt zwar die Abfrage zusammenbasteln, aber Du sollst ja was lernen
    Die zehn Gebote sind deswegen so kurz und logisch, weil sie ohne Mitwirkung von Juristen zustande gekommen sind. (Charles de Gaulle)

    Kommentar


    • #3
      Ich könnte Dir jetzt zwar die Abfrage zusammenbasteln, aber Du sollst ja was lernen
      Super. Genau so wünsch ich mir das.

      Hier ist also der Select. Leider geht der nu gar nicht und sieht auch kriminell aus.

      Code:
      SELECT s.name, w.name, p.id
      FROM projekt as p, partner as s, partner as w
      INNER JOIN s ON (s.id=p.id_partner2 OR s.id=p.id_partner1)
      INNER JOIN w ON (w.id=p.id_partner2 OR w.id=p.id_partner1)
      WHERE s.name ='Meier' LIMIT 10
      Die Fehlermeldung ist:
      "Not unique table/alias: 's'"

      Kann mich grade nicht drum kümmern. Gehe vllt. erst heut abend oder morgen vormittag auf die Suche, was das genau bedeutet. Es sei denn, Du sagst es gleich. Muss eh ein logischer Fehler meinerseits sein. Ich hatte vorhin in der U-Bahn auch eine bessere Idee. Mal sehen, ob ich die wiederfinde.

      MfG
      Marco

      P.S. Gibt es eigentlich eine gute Website, die Joins genauer und von Grund auf erklärt? Mit den üblichen Beispielen über 2 Tabellen kann ich nicht so recht was anfangen.

      Kommentar


      • #4
        Habe den Select etwas verändert:
        Code:
        SELECT s.name, w.name, p.id
        FROM projekt as p
        INNER JOIN partner as s ON (s.id=p.id_partner2 OR s.id=p.id_partner1)
        INNER JOIN partner as w ON (w.id=p.id_partner2 OR w.id=p.id_partner1)
        WHERE s.name ='Meier' LIMIT 10
        Jetzt funktioniert er ohne Fehler, liefert aber nicht, was er soll.
        Sondern:

        P1 |Meier |Meier
        P1 |Meier |Bachmann
        P45 |Meier |Meier
        P45 |Meier |Schulz
        P677 |Meier |Meier
        P677 |Meier |Becker

        Jede 2. Zeile wäre ja fast ok, aber die korrekte Ausgabe(Reihenfolge) von partner1 und partner2 ist wichtig.

        Entweder gibt's jetzt einen Denkanstoß, ne Erklärung, warum das so kommt oder nen Link auf eine gute Join-Theorie-Seite.

        Kommentar


        • #5
          nimm entferne OR in ON-Klausel und baue die Bedingung in ON so um, dass in der einen mit s und in der anderen mit w verknüpft wird.

          Kommentar


          • #6
            Habe den Satz nicht ganz verstanden, aber mit Hilfe von http://www.sql-und-xml.de/sql-tutori...-mit-join.html habe ich evtl. den Weg gefunden und endlich mal die Join-Logik erklärt bekommen:
            Code:
            SELECT s.name, w.name, p.id
            FROM projekt as p
            INNER JOIN partner as s ON s.id=p.id_partner1
            INNER JOIN partner as w ON w.id=p.id_partner2
            WHERE s.name ='Meier' OR w.name='Meier' LIMIT 10
            Morgen probier ichs mal aus.

            Kommentar


            • #7
              Moinmoin allerseits,
              der Select scheint genauso zu funktionieren, wie ich es will. Also Dank für die Hilfe. Obwohl...eigentlich hab ich das ja fast allein gemacht.
              Das Beste ist aber, dass ich (endlich) verstehe und auch erklären kann, wie er funktioniert.
              Was mich aber noch interessiert:
              Wie kann ich den Skript-Performanceunterschied zwischen dieser Lösung (join) und der Alten (siehe erster Post) messen/ausgeben? Wie ich die Meldung der Select-Dauer nach php bekomme, würde mich dabei auch interessieren.

              MfG, Danke, Frohes Fest und Guten Rutsch uswusf,
              Marco

              Kommentar


              • #8
                Hi !

                Ich bin mir zwar nicht ganz sicher, aber meine mich erinnern zu können, dass du eine Zeit angezeigt bekommst, wenn du ein query über PHPMyAdmin absetzt. Einfach beide nacheinander ein paar Mal durchlaufen lassen und dann solltest du sehen können, wer wie schnell läuft.

                Gruß

                Le Cheffe

                Kommentar


                • #9
                  Original geschrieben von Le_Cheffe
                  Ich bin mir zwar nicht ganz sicher, aber meine mich erinnern zu können, dass du eine Zeit angezeigt bekommst, wenn du ein query über PHPMyAdmin absetzt. Einfach beide nacheinander ein paar Mal durchlaufen lassen und dann solltest du sehen können, wer wie schnell läuft.
                  Der myAdmin macht jeweils Abfragen mit LIMIT 0,30, die Laufzeitanzeige ist daher nicht immer aussagekräftig Abfragen mit
                  vielen Datensätzen im Ergebnis.

                  Dass man die von SQL angezeigte Laufzeit irgendwie in php kriegt, hab ich noch nicht gefunden (aber hier gibts ja Leute die wissen noch einiges mehr, z.B. goth oder wahsaga).

                  ganz grob könnte man es so machen
                  [PHP]
                  #Laufzeit in Sekunden
                  $start = time();
                  $result = mysql_query($query, $connect);
                  echo $time()-$start;

                  Für genauere Zeitdifferenz würde ich mal unter microtime nachgucken. oder Du musst mal im phpMyAdmin suchen, wie der
                  die Zeitanzeige macht. Könnte aber ne ziemlich Suche werden.
                  Die zehn Gebote sind deswegen so kurz und logisch, weil sie ohne Mitwirkung von Juristen zustande gekommen sind. (Charles de Gaulle)

                  Kommentar


                  • #10
                    Hallo,
                    hab den "Performanceunterschied" mit dem hier gemessen:

                    Alte Lösung (siehe erster Post): 0.2160s
                    Mit der Joinlösung: 0.2320s

                    Ausgegeben wurden 816 Zeilen. Der Gewinn scheint also nicht erwähnenswert. Aber Hauptsache was gelernt.

                    Frohes Fest!

                    Kommentar

                    Lädt...
                    X