Announcement

Collapse
No announcement yet.

LEFT JOIN begrenzen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • LEFT JOIN begrenzen

    Hi ihr Götter,

    ich denke, das ist eine klassische Anfänger-Frage:

    Ich habe zwei Tabelllen (Person + Bilder). Für eine Übersichtsseite möchte ich nun alle Personen, aber jeweils nur EIN Bild ausgeben (auch wenn´s ggf. mehrere sind). Verknüpft sind Personen.PersonID und Bilder.BildVon DISTINCT bringt´s scheinbar nicht. Wie würdet ihr das angehen?

    Vereinfacht sieht das so aus:

    ***Person
    PersonID
    PersonName

    ***Bilder
    BilderID
    BilderName
    BilderVon

    *** mein Versuch
    SELECT DISTINCT PersonID, PersonName FROM Personen LEFT JOIN Bilder ON Personen.PersonID = Bilder.BildVon

  • #2
    Hallo,

    ...

    SELECT Personen.PersonID, Personen.PersonName
    FROM Personen
    LEFT JOIN Bilder ON Personen.PersonID = Bilder.BildVon
    Group by Personen.PersonID


    [order by ... ]

    Gruß
    Pixel

    Comment


    • #3
      Originally posted by Pixel1001 View Post
      ...

      SELECT Personen.PersonID, Personen.PersonName
      FROM Personen
      LEFT JOIN Bilder ON Personen.PersonID = Bilder.BildVon
      Group by Personen.PersonID


      [order by ... ]

      Gruß
      Das ist schlichtweg falsch. Wenn schon eine gruppierte Abfrage, dann MÜSSEN auch alle Felder der Select-Liste, die keine Aggregatfunktionen sind, auch in der GROUP BY-Liste aufgeführt werden! Leider läßt MySQL solche syntaktisch falschen und unsinnigen Abfragen zu.
      Aber eine Gruppierung hilft hier nicht weiter, da ja sicherlich auch das Bild benötigt wird.
      Solche Abfragen löst man eher min Subselects auf min(pk), bzw. max(pk).
      [highlight=sql]
      SELECT p.PersonID, p.PersonName, b.BilderName
      FROM Personen p
      LEFT JOIN Bilder b ON p.PersonID = b.BildVon
      WHERE b.BilderID = (
      select min(i.BilderID)
      from Bilder i
      where i.BildVon = b.BildVon)
      [/highlight]

      Gruß Falk
      Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

      Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

      Comment


      • #4
        Hallo Falk,

        ja, ich gebe zu das Group By nicht die saubere Lösung ist , aber Sie funktioniert, ist schnell und geht eben bei MYSQL.

        Ich verwende auch Last_Insert_Id() bei MYSQL, das wird bei ORACLE wohl nicht funktionieren. Daher finde ich die kleinen Tricks ganz gut solange die Anwendung nicht transparent auf jede Datenbank anwendbar sein soll.

        Also schlichtweg Falsch ist übertrieben; eher kein SQL92!

        http://de.wikipedia.org/wiki/SQL

        Aber du hast Recht.

        Gruß,

        Pixel1001

        Comment


        • #5
          Hallo Pixel1001,

          Originally posted by Pixel1001 View Post
          ...Daher finde ich die kleinen Tricks ganz gut solange die Anwendung nicht transparent auf jede Datenbank anwendbar sein soll.
          Das sehe ich ganz genauso.
          Aber...
          Originally posted by Pixel1001 View Post
          Also schlichtweg Falsch ist übertrieben; eher kein SQL92!
          ...halte ich diesen "kleinen T(r)ick" von MySQL für einen Bug und nicht für ein Feature und stehe zu meinem "schlichtweg falsch"
          Warum es in meinen Augen ein Bug ist? Weil sich das Ergebnis nicht interpretieren läßt! Wenn ich aus einer Menge Autos die Attribute Marke und Farbe auswähle und nur nach Marke gruppiere, was steht dann in Farbe? Grün?, Gelb?, Bunt? - Ich weiß es nicht, ich weiß nicht mal was ich erwarten würde Das Ergebnis ist in meinen Augen "undefiniert" und die Lösung damit "schlichtweg falsch".

          Gruß Falk
          Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

          Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

          Comment


          • #6
            Hallo allerseits,

            dabei ist auch noch zu beachten, dass das Ergebnis einer Aggregatfunktion mit "Group By" ein anderes sein kann (z. B. bei sum),
            wenn es tatsächlich rote, grüne und bunte Autos gibt.

            Gruß frauwue
            Zuletzt editiert von frauwue; 23.05.2008, 09:40.
            docendo discimus

            Comment


            • #7
              Sorry, wenn das hier etwas Offtopic wird, aber der Hinweis von frauwue ist glatt eine Steilvorlage

              tabelle autos:
              marke farbe
              VW grün
              VW rot
              VW blau
              MB gelb
              MB silber
              MB blau
              BMW rot
              BMW grün
              Mini bunt
              BMW schwarz

              Die Abfrage:
              [highlight=sql]
              SELECT marke, farbe, count(*) anz
              FROM autos
              group by marke
              [/highlight]
              führt bei MySQL zu folgendem Ergebnis:

              marke farbe anz
              BMW rot 3
              MB gelb 3
              Mini bunt 1
              VW grün 3

              Wie ist das Ergebnis nun zu interpretieren? Gibt es drei BMW und sind die alle rot oder sind die meisten BMW rot oder...? Und warum ist VW nicht auch rot?

              Das ist nicht nur Falsch, das ist Müll!

              Gruß Falk
              Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

              Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

              Comment


              • #8
                Hallo Falk,
                nun ja, es kann immer für ein Beispiel ein Gegenbeispiel geben. Schlichtweg Falsch ? Wie sieht die Lösung eigentlich für das erste Posting richtig aus?

                ... ich nun alle Personen, aber jeweils nur EIN Bild ausgeben...
                Hier wird nicht verlangt, dass es das erste, das letzte oder das erste im letzten Monat ist, sondern irgend eins. Mit solchen Aufgaben wurde ich schon öfters konfrontiert und habe auch schon bei dem einen oder anderen Projekt Lehrgeld bezahlt, weil ich aus der selben Sicht heran gegangen bin wie Du. Aber korrekt ist Dein Argument aus Sicht des SQL-Standard's schon.

                Wenn eine Aufgabe zur Gruppierung mit genauerer Definition gestellt wird, so kommt dafür eben eine andere Lösung in betracht.

                Übrigens kaufe ich ein Handy auch nicht wegen der Megapixel, und mein DVD-Player kann auch keine MMS senden, der Toaster kann eben nicht den Verlauf einer Auftoastsession mitschneiden. Aber wer solche Kombinationen benötigt kann es sich doch hinstellen.

                Und ich glaube schon dass sich einige Personen bei MYSQL Gedanken gemacht haben, welche Funktionen etwas verweichlicht werden sollten.
                ODER: Welch ein schöner und hilfreicher BUG bei MYSQL.

                Ich sage nur:

                SELECT Wert1.Tab1,Wert2.Tab2
                FROM (Tabelle1 Tab1, Tabelle2 Tab2)
                WHERE Tab1.ID=Tab2.ID;

                Bei MYSQL bringt die Klammer einen Geschwindigkeitsgewinn von einigen ms.
                Warum? Ein BUG; nun kann ich meinen Kunden sagen:Wartet eben einwenig länger es ist SQL92! Oder: ich nutze den BUG und habe eine bessere Geschwindigkeit erreicht.
                Für welche Variante wird sich der Kunde wohl entscheiden?

                Übrigens habe ich mit meinem Auto schon eine Vollbremsung gemacht; es ist Silbern, aber komisch die Räder standen nicht still sondern haben komisch geruckelt; ein Bug? Bei meinem ersten Auto war das nicht so. Naja, da war ein netter Herr aus der Flugzeugindustrie der solch einen schlichtweg falschen Vorgang erfunden hat, den nun auch noch alle Autos haben? Ich wollte doch eine Vollbremsung haben! Oder?

                Ich habe aber auch wieder dazu gelernt, erst fragen ob es ein Trick, die beste Geschwindigkeit oder der Standard sein soll.

                LG.

                Pixel1001.

                Comment


                • #9
                  Hallo Pixel,

                  da Dag ja auch ein (irgendein) Bild als Ergebnis haben wollte, ist Deine Lösung
                  nicht richtig. Du bekommst damit nur Personen raus. Bei Falks Lösung kommt
                  zumindest der Name eines Bildes raus (das mit der minimalen ID). Das jetzt unabhängig von der Diskussion über zulässige oder nicht zulässige Statements.
                  Meine persönliche Meinung dazu ist, Sql Statements möglichst so zu halten, dass Sie auf vielen DBMS laufen.
                  Das kann viel Ärger bei eventuell erforderlichen Systemumstellungen ersparen. Es kommt natürlich auch drauf an, ob man das ganze professionell betreibt innerhalb von komplexen Anwendungen, oder ob man als Student Übungsaufgaben löst.


                  Gruß frauwue
                  docendo discimus

                  Comment


                  • #10
                    Hallo frauwue,

                    nun gebe ich mich mal geschlagen, da ich wirklich nicht auf die Bilder eingegangen bin und nur einen Tip zur Gruppierung anhand der PersonenID geben wollte.

                    Ich schreibe in meinen Anwendungen meistens eine SQL-Klasse, in der ich die SQL-Befehle, welche auf DB-Sonderfunktionen (oder auch Bugs) zurückgreifen, kabsle.

                    LG
                    Pixel1001

                    Comment

                    Working...
                    X