GROUP BY sortieren?

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

  • GROUP BY sortieren?

    Hallo

    Hab folgende Abfrage, welche soweit auch funktioniert:

    PHP-Code:
    SELECT a.*, b.name FROM preise aladen b WHERE b.id a.laden GROUP BY a.code ORDER BY b.namea.texta.preis DESCa.datum DESC 
    Nehmen wir nun an, in der Tabelle a hat es nun 3 zutreffende Einträge die in der Spalte datum folgende Zahlen stehen haben:

    1
    2
    3

    Nun kann es passieren, dass als Resultat z.B. der Eintrag mit der 2 kommt. Es sollte aber immer der Eintrag mit der höchsten Zahl (also nach Unix-Timestamp sortiert) in der Spalte datum kommen.

    Hab mich durch das Forum gewältst und auch die Dokumentation auf mysql.com durchsucht... hab dort jedoch nichts entsprechendes gefunden (was aber auch daran liegen kann, dass mein Englisch zwar für Unterhaltungen reicht, aber sobald es zu technisch wird... naja).

    Kann mir jemand helfen?
    Achtung: ich diskutiere gern
    http://www.project-angel.org

  • #2
    Nach Datum wird als letztes sortiert.
    Bist Du sicher dass Dein Beispiel den gleichen Namen, Text und Preis hat?

    Du solltest auch statt A.* die einzelnen Spalten schreiben
    und alle in den GROUP BY 'reinnehmen.
    Zuletzt geändert von fuser; 02.06.2004, 17:09.

    Kommentar


    • #3
      Du solltest zunächst einmal mit dem Schwachsinn aufhören nur nach einem der ausgewählten Attribute zu gruppieren ... nur weil MySQL ein solch vermurkstes Statement akzeptiert heißt das nicht das ein vernünftiges Ergebnis dabei herumkommt ... !
      carpe noctem

      [color=blue]Bitte keine Fragen per EMail ... im Forum haben alle was davon ... und ich beantworte EMail-Fragen von Foren-Mitgliedern in der Regel eh nicht![/color]
      [color=red]Hinweis: Ich bin weder Mitglied noch Angestellter von ebiz-consult! Alles was ich hier von mir gebe tue ich in eigener Verantwortung![/color]

      Kommentar


      • #4
        Code:
        SELECT a.name, a.text, a.preis, a.datum, b.name FROM preise a, laden b WHERE b.id = a.laden ...suchabfragen... GROUP BY a.laden, a.code ORDER BY b.name, a.text, a.preis DESC
        Anscheinend steh ich auf dem Schlauch... wie soll ich es sonst machen?

        Die Datenbank enthält Preise verschiedener Produkte aus verschiedenen Läden. Für jedes Produkt gibt es mehrere Einträge, da die Preise mehrmals pro Monat "überwacht" werden. Der einzige weg zu überprüfen, ob es sich bei mehreren Einträgen um das gleiche Produkt handelt, ist hier der Code... sprich, der Code den ihr überall auf den Produkten in z.B. Supermärkten findet.

        Nun sucht man z.B. nach einem Schwamm, gibt in einer Suchmaske einfach "Schwamm" ein und man bekommt alle Schwämme in der Datenbank inkl. Infos wie den entsprechenden Laden, Preis etc. angezeigt. Dabei sollte natürlich pro Produkt immer nur der aktuellste Preis angezeigt werden.

        Wie sollte deiner Meinung nach dann die richtige Abfrage dafür aussehen?

        Anscheinend steh ich auf dem Schlauch... wie soll ich es sonst machen?

        Die Datenbank enthält Preise verschiedener Produkte aus verschiedenen Läden. Für jedes Produkt gibt es mehrere Einträge, da die Preise mehrmals pro Monat "überwacht" werden. Der einzige weg zu überprüfen, ob es sich bei mehreren Einträgen um das gleiche Produkt handelt, ist hier der Code... sprich, der Code den ihr überall auf den Produkten in z.B. Supermärkten findet.

        Nun sucht man z.B. nach einem Schwamm, gibt in einer Suchmaske einfach "Schwamm" ein und man bekommt alle Schwämme in der Datenbank inkl. Infos wie den entsprechenden Laden, Preis etc. angezeigt. Dabei sollte natürlich pro Produkt immer nur der aktuellste Preis angezeigt werden.

        Wie sollte deiner Meinung nach dann die richtige Abfrage dafür aussehen?
        Zuletzt geändert von theangel; 02.06.2004, 17:33.
        Achtung: ich diskutiere gern
        http://www.project-angel.org

        Kommentar


        • #5
          Hallo theangel
          Ich komm' nicht so ganz mit Deinen Spalten zurecht,
          aber Du solltest ALLES was in SELECT steht auch in GROUP BY
          schreiben:
          SELECT a.name, a.text, a.preis, a.datum, b.name
          GROUP BY a.name, a.text, a.preis, a.datum, b.name
          Das ist nicht nur hier so sondern gilt allgemein.
          Nur Aggregatfunktionen wie SUM(), COUNT() erscheinen nicht im GROUP BY.

          Dann die Sortierung:

          Dabei sollte natürlich pro Produkt immer nur der aktuellste Preis angezeigt werden
          Ich nehme an, der aktuellste Preis ist der niedrigste, oder hast Du ein Datum??

          Dann muss der Preis nach vorn und nicht nach hinten:
          ORDER BY preis,laden

          PS: Der Code heisst EAN

          [edit] uups.. Du hast ein Datum. Dann ORDER BY datum desc, preis desc ,laden

          Dann kommt der Aktuellste zuerst.
          Zuletzt geändert von fuser; 03.06.2004, 07:48.

          Kommentar


          • #6
            Es will nicht wirklich klappen. Hier nun die jetzt verwendete Abfrage:

            Code:
            SELECT a.text, a.preis, a.code, a.datum, b.name FROM preise a, laden b WHERE b.id = a.laden ...suchstatements... GROUP BY a.text, a.preis, a.code, a.datum, b.name ORDER BY a.datum DESC, b.name, a.text, a.preis DESC
            Um das ganze besser zu veranschaulichen, hier mal zwei Links:

            -> http://www.project-angel.org/de/privately
            -> http://www.project-angel.org/phpMyAdmin

            User/Passwort bei beiden: ******

            Suche ich nun einfach nach dem Code 1568 (alles nur Beispieldaten in der DB), sollte einmal der Preis "5.22" von Laden 1 kommen, sowie der Preis 2.99 von Laden 2.
            Zuletzt geändert von theangel; 03.06.2004, 09:24.
            Achtung: ich diskutiere gern
            http://www.project-angel.org

            Kommentar


            • #7
              Hallo!
              Aha! Nur zum Verständnis, Du willst eine Liste mit:

              1 Zeile pro Laden
              In dieser Zeile soll der aktuellste Preis für diesen Laden stehen
              Die Läden sollen nach Preis aufsteigend sortiert werden (billigste zuerst)

              Hab' ich das richtig verstanden??

              Mach 'mal bitte das PW wieder 'raus bevor ein Idiot Unfug damit macht.

              PS: Die Welt ist klein, in einem geh' ich heute Abend noch einkaufen!!

              Kommentar


              • #8
                Man kann bei beiden eigentlich keinen Unfug machen... bei phpMyAdmin hat der User nur Leserechte, aber ich habs mal rausgenommen.

                Also, wenn ich nun z.B. nach dem EAN-Code suche, soll er mir pro Laden nur ein Resultat bringen, nämlich das neueste (nach Datum). Nach Produktnamen zu gruppieren wäre unpassend, da man sich dort ja mal verschrieben haben könnte.

                Wenn ich nach Produktnamen suche, wird das per LIKE getan, aber trotzdem sollte nach EAN Gruppiert werden und nur der neueste Eintrag gezeigt werden (innerhalb dieser EAN-Gruppierung).
                Achtung: ich diskutiere gern
                http://www.project-angel.org

                Kommentar


                • #9
                  Dann reicht ein SQL nicht.
                  Am besten (->schnellsten) geht das über eine temporäre Tabelle.
                  Als erstes die aktuellen Preise pro Laden suchen (nur das, keie weiteren Spalten hier!):
                  create temporary table tmp select max(datum) as datum,laden from preise group by laden

                  Dann den Rest 'dranhängen, etwa so:

                  select ...
                  from tmp A
                  left join preise B on A.datum=B.datum and A.laden=B.laden
                  left join laden C on B.ean=C.ean
                  order by preis desc

                  Kommentar


                  • #10
                    Danke vielmal für deine Hilfe, so funktioniert es nun! Wäre ehrlich gesagt niemals alleine auf die Lösung gekommen.


                    PHP-Code:
                    CREATE TEMPORARY TABLE tmp SELECT MAX(A.datum) AS datumA.laden FROM preise A WHERE 1 1".$suchesql." GROUP BY A.laden 
                    PHP-Code:
                    SELECT B.textB.preisB.eanB.datumC.name FROM tmp A LEFT JOIN preise B ON A.datum B.datum and A.laden B.laden LEFT JOIN laden C ON B.laden C.id ORDER BY preis 
                    Achtung: ich diskutiere gern
                    http://www.project-angel.org

                    Kommentar

                    Lädt...
                    X