Announcement

Collapse
No announcement yet.

GROUP BY vermurkst spalte

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

  • GROUP BY vermurkst spalte

    Hallo Leute,

    mir funkt hier die GROUP BY Funktion dazwischen.

    Es soll der kleinste Preis aller Objekte gefunden werden, also eine Liste der Objekte mit kleinstem Preis und passendem Preistyp.

    Es gibt pro Objekt mehrere Preise. Diese können den Typ WO oder TA haben. Es soll der kleinste Preis gefunden werden und der diesem Preis zugehörige Preistyp.

    Problem ist, dass er den kleinsten findet, aber wegen der Gruppierung
    natürlich den Preistyp verhaut.


    PHP Code:
    SELECT o.id o.titleMINpc.preis ) AS pricepc.preistyp
    FROM tab_objects 
    AS o
    LEFT JOIN tab_object_prices 
    AS pc ON o.id pc.hausnr
    GROUP BY o
    .id 

    WICHTIG: Subselects dürfen nicht verwendet werden.
    Vielleicht hat ja jemand einen Tipp!

  • #2
    Ich kann mir nicht vorstellen wie das ohne Subselect funktionieren soll. Das GROUP BY schränkt die Ausgabefelder eben auf die ein die entweder in der GROUP BY Klausel stehen (da darf ja bei Dir nur o.Id stehen) und die durch eine Gruppenfunktion verarbeitet werden.

    Bleiben als Ausgabefelder o.Id und MIN( pc.preis ).

    Mir fällt nichts ein wie man das in einem SQL Kommando ohne Subselect machen kann, ausser man setzt im Programm noch ein zusätzliches SQL Kommando ab, welches einem dann das gewünschte Preisobjekt aus der Datenbank holt.

    Comment


    • #3
      Hallo mesia3,

      anhand Deiner Beschreibung kann ich nicht nachvollziehen, wo das Problem ist. So aussagekräftige Begriffe wie "vermurkst" oder "verhaut" sind auch nicht hilfreich.

      Dein SQL Statement ist syntaktisch falsch, ich vermute mal, Du nutzt eine ältere MySQL Version, die das kaschiert; kann man hier im Forum in jeden 4. Beitrag nachlesen.
      Bei einem GROUP BY müssen alle Felder, die nicht aggregiert werden, auch im GROUP BY enthalten sein.
      Kann es deshalb vielleicht sein, dass nun durch das "implizite" GROUP falsche Ergebnisse bei raus kommen.

      Richtig muss es heissen:
      [highlight=SQL]SELECT o.id, o.title, MIN( pc.preis ) AS price, pc.preistyp
      FROM tab_objects AS o
      LEFT JOIN tab_object_prices AS pc
      ON o.id = pc.hausnr
      GROUP BY o.id, o.title, pc.preistyp[/highlight]
      Olaf Helper

      <Blog> <Xing>
      * cogito ergo sum * errare humanum est * quote erat demonstrandum *
      Wenn ich denke, ist das ein Fehler und das beweise ich täglich

      Comment


      • #4
        Das Statement is schon ok, die abfrage läuft auf mysql5. Ein Fehler würde beim GROUP BY kommen, wenn die zuständige Systemvariable entsprechend gesetzt wäre. Aber darum gehts hier ja nicht.

        Dein Vorschlag bringt natürlich ein falsches Ergebnis, da ich weder nach title noch nach preistyp gruppieren darf. Wenn Du das Problem nicht nachvollziehen kannst ist das ja auch klar.

        Das ist eigentlich ein mysql Problem, welches als "Within-group aggregates" bekannt ist. Dazu gibt es auch eine Reihe trickreicher Lösungen hier:
        http://www.artfulsoftware.com/infotr...ries.php?&bw=0
        (einfach nach "Within-group aggregates" suchen)

        Allerdings ist es mir noch nicht gelungen eine davon anzuwenden, da meine Tabellen ja etwas anders strukturiert sind.

        Comment


        • #5
          Dein Vorschlag bringt natürlich ein falsches Ergebnis, da ich weder nach title noch nach preistyp gruppieren darf.
          Ein Vorschlag war es nicht, nur die Darstellung, wie das Statement auf Basis der selektierten Daten korrekt wäre.

          Wenn Du nicht nach Title und Preistyp gruppieren willst, dann lass sie aus dem Statement raus.
          Mein Vorschlag wäre damit:
          [highlight=SQL]SELECT o.id, MIN(pc.preis) AS price
          FROM tab_objects AS o
          LEFT JOIN tab_object_prices AS pc
          ON o.id = pc.hausnr
          GROUP BY o.id[/highlight]

          BTW, mach aus dem LEFT ein INNER JOIN, ist performanter und NULL Werte aggregieren, bringt nichts.
          Olaf Helper

          <Blog> <Xing>
          * cogito ergo sum * errare humanum est * quote erat demonstrandum *
          Wenn ich denke, ist das ein Fehler und das beweise ich täglich

          Comment


          • #6
            Dein Vorschlag ist das, was ich zu beginn geschrieben habe

            Wer aggregiert den NULL-Werte?

            SELECT p1.item,p1.supplier,p1.price
            FROM products AS p1
            LEFT JOIN products AS p2 ON p1.item = p2.item AND p1.price > p2.price
            WHERE p2.item IS NULL;

            Hier wird eine Tabelle auf sich selbst "gejoint" unter ausschluss der nicht zutreffenden werte, uralter Trick.

            Ich glaub ich probiers einfach weiter...

            Comment


            • #7
              Ich verstehe von Mal zu Mal immer weniger; vielleicht versteht es jemand anderes?
              Mach es gut und viel Erfolg.
              Olaf Helper

              <Blog> <Xing>
              * cogito ergo sum * errare humanum est * quote erat demonstrandum *
              Wenn ich denke, ist das ein Fehler und das beweise ich täglich

              Comment


              • #8
                Hallo,

                ich kann mich O.Helper und fanderlf nur anschließen: Ohne Subselect ist solch ein Problem in SQL nicht lösbar. Mögliche Ausnahme: Irgendein MySQL-Murks der durch weglassen von nichtaggregierten Spalten in der GROUP BY-Klausel (zufällig) das gewünschte Ergebnis bringt. Aber da werde ich mich raus halten

                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

                Working...
                X