ver2felt: tabelle sortieren und in array ausgeben

Hallo bin ver2felt,

finde euer Forum richtig super und lese regelmäßig die Postings, bei der Suche habe ich aber leider nichts gefunden, bei google leider auch nichts...

Vielleicht könnt ihr mir helfen:

Habe folgende Tabelle mit einigen Testdaten:

warenkorb:
cart_id   produkt_id  parent_id    parent
   1          12        123        parent
   2          13        456        parent
   3          14        456        child
   4          15        456        child

Die Frage:

wie müsste meine Abfrage bzw. PHP code aussehen, dass ein Array gebildet wird, dass zu jeder parent_id die jeweiligen Produkt_ids beinhaltet.

also z.B.:

array [0] => parent_id  : 123
             produkt_id : (12)

array [1] => parent_id  : 456
             produkt_id : (13, 14, 15)

wobei die "parents" Pizzas sein werden und die "childs" Zutaten, wenn man noch nach child und parent innerhalb der arrays sortieren könnte, wäre es genial, will aber eure zeit nicht zu arg in Anspruch nehmen...

Hoffe ihr könnt mir helfen, vielleicht auch nur ein tip, damit ich auf die richtige spur komme

ciao,

bin ver2felt

  1. Hallo

    wie müsste meine Abfrage bzw. PHP code aussehen, dass ein Array gebildet wird, dass zu jeder parent_id die jeweiligen Produkt_ids beinhaltet.

    was hast du denn schon versucht?
    Zeige doch mal deine SELECT Abfragen?

    viele Grüße
    hawk

    1. Hallo,

      bins wieder ver2felt... danke für die Antwort hawk

      was hast du denn schon versucht?
      Zeige doch mal deine SELECT Abfragen?

      Also ich hab schon so einiges versucht und alles davon ging größtenteils, aber in letzter Konsequenz dann halt doch nicht. So z.B. bei diesem Versuch:

      $getProducts_query ="SELECT produkt_id, parent_id, anzahl FROM warenkorb WHERE parent = 'true' ORDER BY cart_id DESC";
        $getProducts_res = mysql_query($getProducts_query);
        while ($cartProduct = mysql_fetch_array($getProducts_res))
        {
         $product_detail_query = "SELECT produkt_name, preis FROM produkte WHERE produkt_id = '".$cartProduct['produkt_id']."'";
         $product_detail_res = mysql_query($product_detail_query);
         $this->product_detail = mysql_fetch_array($product_detail_res);

      $this->cartProducts[] = array ("produkt_id" => $cartProduct['produkt_id'],
                   "parent_id" => $cartProduct['parent_id'],
                      "produkt_anzahl" => $cartProduct['anzahl'],
                   "produkt_name" => $this->product_detail['produkt_name'],
                   "produkt_preis" => $this->product_detail['preis']);

      }

      $getProducts_query ="SELECT parent_id
              FROM warenkorb
              WHERE parent = 'true'
              ORDER BY cart_id DESC";
        $getProducts_res = mysql_query($getProducts_query);
        while ($getProducts = mysql_fetch_array($getProducts_res))
        {

      $this->parent_ids[] = $getProducts['parent_id'];

      }

      Lese hier erst mal die parent_ids aus und die dazugehörigen produkt_ids, bilde hernach ein Objekt mit den Informationen wie Preis, anzahl usw. und schließlich sollten dann am Ende noch die Zutaten rein... Hoffe, dass hilft weiter...

      viele Grüße
      hawk

      ciao

      bin ver2felt

  2. Hallo,

    finde euer Forum richtig super und lese regelmäßig die Postings, bei der Suche habe ich aber leider nichts gefunden, bei google leider auch nichts...

    warenkorb:
    cart_id   produkt_id  parent_id    parent
       1          12        123        parent
       2          13        456        parent
       3          14        456        child
       4          15        456        child

    array [0] => parent_id  : 123
                 produkt_id : (12)

    array [1] => parent_id  : 456
                 produkt_id : (13, 14, 15)

    mit MySQL ist dies recht einfach. Es gibt die Aggregatsfunktion GROUP_CONCAT

    wobei die "parents" Pizzas sein werden und die "childs" Zutaten, wenn man noch nach child und parent innerhalb der arrays sortieren könnte,

    die auch eine ORDER-BY-Klausel kennt.

    wäre es genial, will aber eure zeit nicht zu arg in Anspruch nehmen...

    Das recht einfache SQL-Statement soll also folgendes liefern:

    Gib mir
        für jede parent_id
        die aufsteigend sortierte durch Komma getrennte Liste der produkt_ids
    aus der Tabelle warenkorb
    wobei es für jede
        der parent_id
        nur einen Datensatz geben soll.

      
    SELECT                                -- Gib mir  
        parent_id,                        -- die parent_id  
        [link:http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat@title=GROUP_CONCAT](                 -- und die Liste der zugehörigen  
            [link:http://dev.mysql.com/doc/refman/5.0/en/cast-functions.html#function_cast@title=CAST](product_id AS CHAR)  -- in Zeichenketten umgewandelten product_ids  
            ORDER BY product_id           -- aufsteigend sortiert,  
            SEPARATOR ', '                -- durch Komma und Leerzeichen getrennt  
        ) zutaten                         -- (gib der Spalte einen netten Namen=  
    FROM                                  -- aus der Tabelle  
        warenkorb                         -- warenkorb  
    GROUP BY                              -- gruppiert nach (d.h. ein Wert je)  
        parent_id                         -- den verschiedenen Werten der parent_id,  
    ORDER BY                              -- aufsteigend sortiert nach  
        parent_id                         -- der parent_id  
    
    

    liefert bei Deinen Daten folgendes Ergebnis:

    parent_id zutaten
    --------- ----------
    123       12
    456       13, 14, 15

    Dein zweiter Beitrag läßt mich vermuten, dass Du ein Anfänger in Sachen SQL bist. Das ist nichts Schlimmes: jeder hat einmal angefangen. SQL-Abfragen in Schleifen abzufeuern, ist meist keine gute Idee. Typischerweise will man in solchen Fällen einen JOIN verwenden. Statt über Schleifen diese id-Werte in Namen wie "Pizza Diavolo" und "Peperoni" oder "Salami" umzusetzen, solltest Du diese Namen aus den entsprechenden Tabellen nehmen.

    Zu Joins findest Du unter SELFHTML aktuell zwei Artikel, die Dir beim Einstieg helfen können:

    - Einführung in Joins
      - Fortgeschrittene Jointechniken

    Freundliche Grüße

    Vinzenz

    1. Hallo und danke Schön,

      muss ich gleich mal ausprobieren...

      Dein zweiter Beitrag läßt mich vermuten, dass Du ein Anfänger in Sachen SQL bist. Das ist nichts Schlimmes: jeder hat einmal angefangen. SQL-Abfragen in Schleifen abzufeuern, ist meist keine gute Idee. Typischerweise will man in solchen Fällen einen JOIN verwenden. Statt über Schleifen diese id-Werte in Namen wie "Pizza Diavolo" und "Peperoni" oder "Salami" umzusetzen, solltest Du diese Namen aus den entsprechenden Tabellen nehmen.

      werde mir das mit den Joins auf jeden Fall anschauen, mache zwar schon eine Weile mit SQL rum, aber die Sicherheit was ich wie wann wo einzusetzen habe fehlt mir leider, aber mit etwas Übung wird es hoffentlich für meine Belange ausreichen

      vielen Dank für die Hilfe

      bin nicht mehr so ver2felt

    2. Super!!!

      funktioniert wunderbar, da wäre ich nie draufgekommen...
      Werde mir gleich mal ein gutes Buch zu SQL besorgen, damit ich das irgendwann mal selber hinbekomme

      danke nochmal

      ich war ver2felt

      Hallo,

      finde euer Forum richtig super und lese regelmäßig die Postings, bei der Suche habe ich aber leider nichts gefunden, bei google leider auch nichts...

      warenkorb:
      cart_id   produkt_id  parent_id    parent
         1          12        123        parent
         2          13        456        parent
         3          14        456        child
         4          15        456        child

      array [0] => parent_id  : 123
                   produkt_id : (12)

      array [1] => parent_id  : 456
                   produkt_id : (13, 14, 15)

      mit MySQL ist dies recht einfach. Es gibt die Aggregatsfunktion GROUP_CONCAT

      wobei die "parents" Pizzas sein werden und die "childs" Zutaten, wenn man noch nach child und parent innerhalb der arrays sortieren könnte,

      die auch eine ORDER-BY-Klausel kennt.

      wäre es genial, will aber eure zeit nicht zu arg in Anspruch nehmen...

      Das recht einfache SQL-Statement soll also folgendes liefern:

      Gib mir
          für jede parent_id
          die aufsteigend sortierte durch Komma getrennte Liste der produkt_ids
      aus der Tabelle warenkorb
      wobei es für jede
          der parent_id
          nur einen Datensatz geben soll.

      SELECT                                -- Gib mir
          parent_id,                        -- die parent_id
          [link:http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat@title=GROUP_CONCAT](                 -- und die Liste der zugehörigen
              [link:http://dev.mysql.com/doc/refman/5.0/en/cast-functions.html#function_cast@title=CAST](product_id AS CHAR)  -- in Zeichenketten umgewandelten product_ids
              ORDER BY product_id           -- aufsteigend sortiert,
              SEPARATOR ', '                -- durch Komma und Leerzeichen getrennt
          ) zutaten                         -- (gib der Spalte einen netten Namen=
      FROM                                  -- aus der Tabelle
          warenkorb                         -- warenkorb
      GROUP BY                              -- gruppiert nach (d.h. ein Wert je)
          parent_id                         -- den verschiedenen Werten der parent_id,
      ORDER BY                              -- aufsteigend sortiert nach
          parent_id                         -- der parent_id

      
      >   
      > liefert bei Deinen Daten folgendes Ergebnis:  
      >   
      > parent\_id zutaten  
      > --------- ----------  
      > 123       12  
      > 456       13, 14, 15  
      >   
      > [Dein zweiter Beitrag](https://forum.selfhtml.org/?t=180918&m=1196123) läßt mich vermuten, dass Du ein Anfänger in Sachen SQL bist. Das ist nichts Schlimmes: jeder hat einmal angefangen. SQL-Abfragen in Schleifen abzufeuern, ist meist keine gute Idee. Typischerweise will man in solchen Fällen einen JOIN verwenden. Statt über Schleifen diese id-Werte in Namen wie "Pizza Diavolo" und "Peperoni" oder "Salami" umzusetzen, solltest Du diese Namen aus den entsprechenden Tabellen nehmen.  
      >   
      > Zu Joins findest Du unter SELFHTML aktuell zwei Artikel, die Dir beim Einstieg helfen können:  
      >   
      >   - [Einführung in Joins](http://aktuell.de.selfhtml.org/artikel/datenbanken/joins/)  
      >   - [Fortgeschrittene Jointechniken](http://aktuell.de.selfhtml.org/artikel/datenbanken/fortgeschrittene-joins/)  
      >   
      >   
      > Freundliche Grüße  
      >   
      > Vinzenz