Ankündigung

Einklappen
Keine Ankündigung bisher.

Bei Gruppierung auch die dazugehörigen daten ausgeben

Einklappen

Neue Werbung 2019

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

  • Bei Gruppierung auch die dazugehörigen daten ausgeben

    Hallo an alle,

    ich habe folgende MySQL Tabelle mit dem Namen autos:

    id hersteller_id model farbe
    1 1 A3 schwarz
    2 1 A3 rot
    3 2 318 blau
    4 1 A3 schwarz

    Nun will ich hersteller_id, model und farbe gruppieren mit

    SELECT * FROM autos GROUP BY hersteller_id, model, farbe

    damit ich keine gleiche Einträge ausgebe.

    Meine Frage ist jetzt ob ich irgendwie über die selbe Abfrage auch an alle gruppierten ids kommen kann ?

    also bei der Ausgabe bekomme ich ja laut der meiner Tabelle

    1 A3 schwarz
    1 A3 rot
    2 318 blau

    da die zwei Zeilen mit 1 A3 schwarz gruppiert wurden.

    Ich brauche jetzt wenn möglich die id 1 und die id 4 von den zwei gruppierten Zeilen aus meiner Abfrage ?

    Gibt es irgend einen Weg ?

    Danke für jede Hilfe








  • #2
    Du solltest niemals SELECT * verwenden. Eigentlich müsste die Datenbank bei dieser Abfrage einen Fehler werfen, wenn sie richtig konfiguriert ist. Ansonsten erhältst du ein zufälliges ergebnis.

    Zwei mögliche Lösungen für dein Problem:

    a) mit GROUP_CONCAT() die IDs aggregieren

    b) das Ergebnis nicht in der Datenbank, sondern mit PHP gruppieren

    Kommentar


    • #3
      Ok Vielen Dank !!!

      Kommentar


      • #4
        Zunächst einmal mach das select * weg. Das geht gar nicht. In diesem Fall würde dir ein richtig konfiguriertes mySQL sogar einen Fehler werfen weil du nicht nach allen spalten gruppiert hast die im select angegeben sind.

        Also folgendes ist in neuren mySQL Version ein Fehler

        Code:
        SELECT hersteller_id, model, farbe
        FROM table
        GROUP BY hersteller_id
        da du keine Angabe machst welches model und welche färbe du eigentlich haben willst wenn es zwei eintrage mit gleichem Hersteller gibt.

        Zu deiner eigentlichen Frage: Ich weiß nicht genau was der Query dann bezwecken soll. Willst du nun Duplikate haben oder nicht? Wenn nein, dann gibts natürlich auch nur eine id. Du kannst auch deine id mit group_concat zu einem String machen aber ich bezweifele das das ist was du erwartest.

        Code:
        SELECT GROUP_CONCAT(id), hersteller_id, model_farbe
        FROM table
        GROUP BY hersteller_id, model, farbe
        Pre-Coffee-Posts sind mit Vorsicht zu geniessen!

        Kommentar


        • #5
          Zitat von hellbringer Beitrag anzeigen
          Zwei mögliche Lösungen für dein Problem:

          a) mit GROUP_CONCAT() die IDs aggregieren

          b) das Ergebnis nicht in der Datenbank, sondern mit PHP gruppieren
          Zu b) ein Beispiel:

          PHP-Code:
          $data 'id hersteller_id model farbe
          1 1 A3 schwarz
          2 1 A3 rot
          3 2 318 blau
          4 1 A3 schwarz'
          ;

          $newData TableArray::createFromString($data,' ')
            ->
          firstRowToKey()
            ->
          filterGroupAggregate(['id' => 'CONCAT'],['hersteller_id','model','farbe'],",")
            ->
          fetchAll()
          ;
          debug::write($newData); 
          Hier ist CONCAT als "Aggregate-Funktion" implementiert. Die id's werden mit einen Komma verknüpft. Gruppiert wird dann nach 'hersteller_id','model','farbe'.

          TableArray kann direkt ein PDO-Statement verarbeiten. Wird das Resultat einer DB-Abfrage abgerufen, dann lauten die ersten Zeilen so:

          PHP-Code:
          $sql "SELECT id, hersteller_id, model, farbe from autos";
          $stmt $db->query($sql);
          $tabArr TableArray::create($stmt)
            ->
          filterGroupAggregate(... 
          Result:

          PHP-Code:
          array (
            
          => 
            array (
              
          'id' => "1,4",
              
          'hersteller_id' => "1",
              
          'model' => "A3",
              
          'farbe' => "schwarz",
            ),
            
          => 
            array (
              
          'id' => "2",
              
          'hersteller_id' => "1",
              
          'model' => "A3",
              
          'farbe' => "rot",
            ),
            
          => 
            array (
              
          'id' => "3",
              
          'hersteller_id' => "2",
              
          'model' => "318",
              
          'farbe' => "blau",
            ),

          PHP-Klassen auf github

          Kommentar


          • #6
            Ich möchte noch JSON_ARRAYAGG und JSON_OBJECTAGG in die Runde werfen.
            Dann hat man auch direkt ein JSON Array, mit dem man weiter arbeiten kann, z.B. im HAVING Bereich der Abfrage.

            MySQL :: MySQL 5.7 Reference Manual :: 12.20.1 Aggregate Function Descriptions

            Code:
            CREATE TABLE test(
            id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
            hersteller_id INT(6) UNSIGNED NOT NULL,
            model VARCHAR(30) NOT NULL,
            farbe VARCHAR(30) NOT NULL
            );
            
            INSERT INTO test VALUES
            (1, 1, 'A3', 'schwarz'),
            (2, 1, 'A3', 'rot'),
            (3, 2, '318', 'blau'),
            (4, 1, 'A3', 'schwarz')
            ;
            
            SELECT JSON_ARRAYAGG(id) as ids, hersteller_id, model, farbe FROM test GROUP BY hersteller_id, model, farbe;
            Ausgabe:
            ids hersteller_id model farbe
            [2] 1 A3 rot
            [1, 4] 1 A3 schwarz
            [3] 2 318 blau

            Kommentar

            Lädt...
            X