*jiriki*: Sinn von GROUP BY ?

Moinsen,
bin hier gerade an ner Uniaufgabe, und frag mich ERNSTHAFT, was der Sinn von einer GROUP BY-Abfrage sein soll. Wenn ich mir eine SELECT-Abfrage gruppieren lasse, spuckt er mir anscheinend immer nur den ersten Datensatz einer Gruppierung aus. Das heisst, wenn ich eine Lagerverwaltung hab, und im Lager sind x, y, z Produkte von drei verschiedenen Anbietern, und ich mache

SELECT * FROM vorrat GROUP BY anbieter

dann gibt er mir in der Ergebnistabelle nur drei Datensätze zurück. Ok, sollen das jetzt meine drei "Gruppen" sein? Wenn ja, wie komm ich wieder an die anderen Datensätze, die ebenfalls zu den drei Gruppen gehören? Ich verstehs nicht. Danke!

Greets, *jiriki*

  1. Hi,

    bin hier gerade an ner Uniaufgabe, und frag mich ERNSTHAFT, was der Sinn von einer GROUP BY-Abfrage sein soll.

    solange Du andere Spalten selektierst als gruppierst, sehe ich da auch keinen Sinn. Ein ordentliches DBMS wird dies mit einem Fehler quittieren, weil es schlicht und ergreifend keinen Sinn _hat_ - ich sehe es als einen erheblichen Mangel von MySQL an, dass dies dennoch "irgendwas" daraus macht. Unabhängig davon ist die Selektion von "*" außerhalb von Testfällen _extrem_ unsinnig. Gib _immer_ _genau_ die Spalten an, die Du selektieren möchtest.

    dann gibt er mir in der Ergebnistabelle nur drei Datensätze zurück. Ok, sollen das jetzt meine drei "Gruppen" sein?

    Ja. Die Wahl der Datensätze ist willkürlich - weil Du andere Spalten selektierst als gruppierst. Im übrigen scheinst Du noch nicht auf Gruppenfunktionen wie z.B. COUNT(), SUM(), MIN() oder MAX() gestoßen zu sein.

    Wenn ja, wie komm ich wieder an die anderen Datensätze, die ebenfalls zu den drei Gruppen gehören?

    Die Datensätze an sich möchtest Du gar nicht mehr haben, deswegen gruppierst Du ja.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Tag Cheatah.

      Unabhängig davon ist die Selektion von "*" außerhalb von Testfällen _extrem_ unsinnig. Gib _immer_ _genau_ die Spalten an, die Du selektieren möchtest.

      Da ich gerade anfange, mich mit mySQL zu beschäftigen, eine kurze Zwischenfrage: warum?

      Siechfred

      --
      »Sie kochten heimlich mit Wasser und tranken öffentlich Wein.«
      1. Hi,

        das hat verschiedene Gründe (meiner naiven Ansicht nach...):

        1. Die Datenbank puffert unter Umständen aus Transaktionsgründen das Ergebnis deiner Abfrage, d.h. sie liest beim Zugriff auf die Datensätze nicht unbedingt direkt aus den Tabellen aus sondern aus einem Zwischenspeicher den sie sich erstellt hat. Wenn du ein SELECT * machst lädst du den gesamten Inhalt der Tabelle da rein, obwohl du ggf. nur zwei Spalten brauchst. Bei einer Tabelle mit 100 Feldern ist das schon ein gewaltiger Unterschied im Speicherbedarf.
        2. Viel interessanter ist noch die Veränderung der Tabelle. SELECT * liefert dir alle Spalten in einer Reihenfolge (wenn du Glück hast so wie du sie selbst mal angelegt hast). Aber was passiert wenn jemand die Tabelle neu anlegt (mit anderer Reihenfolge) oder gar neue Spalten einfügt? Du musst alle deine Abfragen anpassen damit du auf die korrekten Spalten zugreifst (je nachdem ob du mit Spaltennamen oder Nummern arbeitest). Hättest du direkt die Spalten die du haben willst mit Namen angesprochen könnte dir das alles egal sein, die kämen immer in der richtigen Reihenfolge an...

        MfG
        Rouven

        --
        -------------------
        ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
  2. Hallo,

    SELECT * FROM vorrat GROUP BY anbieter

    Ich frage mich wirklich, warum es Datenbanken gibt, die solche Statements zulassen. Das geht vollkommen am Sinn von GROUP BY vorbei.

    GROUP BY macht imho nur in Verbindung von Aggregat-Funktionen Sinn.

    Hier ein Beispiel:
    SELECT anbieter, SUM(anzahl_lagernd) FROM vorrat GROUP BY anbieter

    Das würde dir den Lagerstand gruppiert nach Anbietern liefern.

    Grüße
      Klaus

  3. Jo, ok, danke, ich glaub, ich habs jetzt gerafft. Noch zwei Abfragetypen (Subanfragen und rel. Division), dann hab ichs geschafft. Danke.