kEv*: GROUP BY, DISTINCT, ORDER BY

Hallo liebe SELFHTMLer,

mal wieder mit einer Frage an euch.
Folgendes Problem:

Eine Datenbanktabelle mit folgender Struktur:

id|playerid|p1|p2|p3|universum|
1    2      21 22 23    1
2    2      1  2  3     1
3    1      21 44 4     1
4    1      12 9  8     2

Ich habe eine SQL Abfrage die sieht folgendermaßen aus:
$sql = mysql_query ('SELECT id,playerid,universum,p1,p2,p3 FROM hsp ORDER BY universum,p1 ASC ');

Vorrangig geht es mir bei der Abfrage um die Sortierung.
Sortiere zuerst nach Universum und dann p1.

Nun arbeite ich mit vLib als Template Engine. Da es sich hier ja um noch keine komplexe Datenbankabfrage handelt kann ich in vLib den o.g. Query in einen einfachen DB-LOOP ausgeben lassen.

Die jetzige Ausgabe ist in dem Template so:

...
<tmpl_loop name='hsp'>
 <h1>{tmpl_var name='p1'}</h1>
 <ul>
  <li>{tmpl_var name='p1'}:{tmpl_var name='p2'}:{tmpl_var name='p3'}</li>
 </ul>
</tmpl_loop>
...

HTML Ausgabe (Leider ohne Formatierung :) )
1

1:2:3

21

21:22:23

21

21:44:4

12

12:9:8

Folgendes will ich in der Abfrage aber eigentlich noch zusätzlich erreichen, nur leider weiß ich nicht so recht wie!

Alle Zeilen die in der SPALTE p1 gleich sind sollen keine EXTRA Liste haben, sondern in die vorhandene eingetragen werden.
So also:

1
1:2:3

21
21:22:23
21:44:4

12
12:9:8

Wo kann ich da ansetzten?
Schon am Query oder muß ich das über das vLib lösen?
Wichtig ist, das die Inhalte der Spalten nicht gemischt werden.
p1,p2 und p3 gehören genauso zusammen wie die dazugeörige playerid und das universum.

Vielen Dank für Ansätze ...

LG
kev1n

--
SELFCODE:
sh:( fo:| ch:? rl:° br:^ ie:{ mo:| va:) de:] zu:) ss:| ls:[ js:|
---
  1. Vielen Dank für Ansätze ...

    Du holst Dir die Datensatzmenge wie gehabt mit Deinem SQL und formatierst die Ausgabe indem Du Dein Array (Deine Datensatzmenge) durchläufst.

    Wir merken uns: Wir trennen den Datenzugriff und die Ausgabe und nutzen den Datenserver möglichst nicht für Formatierungszwecke.

    1. Hallo liebe SELFHTMLer,

      Vielen Dank für Ansätze ...

      Du holst Dir die Datensatzmenge wie gehabt mit Deinem SQL und formatierst die Ausgabe indem Du Dein Array (Deine Datensatzmenge) durchläufst.

      Wir merken uns: Wir trennen den Datenzugriff und die Ausgabe und nutzen den Datenserver möglichst nicht für Formatierungszwecke.

      Ich hatte nicht vor Datenzugriff zu formatieren.
      Aber vielleicht besteht die Möglich den Query schon so zu bekommen.

      Irgendwie war ich nach deinem Post nicht schlauer.
      Das war mir schon klar.

      Weißt du was vLib ist?

      LG
      kev1n

      --
      SELFCODE:
      sh:( fo:| ch:? rl:° br:^ ie:{ mo:| va:) de:] zu:) ss:| ls:[ js:|
      ---
      1. Ich hatte nicht vor Datenzugriff zu formatieren.
        Aber vielleicht besteht die Möglich den Query schon so zu bekommen.

        Mag sein, dass das geht, aber das sollte die "umgebende Logik", sprich PHP oder so, erledigen.

        Weißt du was vLib ist?

        Nö, ich weiss auch nicht was ein "DB-Loop" ist (hört sich aber ätzend an ;).

        1. Hallo liebe SELFHTMLer,

          Ich hatte nicht vor Datenzugriff zu formatieren.
          Aber vielleicht besteht die Möglich den Query schon so zu bekommen.

          Mag sein, dass das geht, aber das sollte die "umgebende Logik", sprich PHP oder so, erledigen.

          Weißt du was vLib ist?

          Nö, ich weiss auch nicht was ein "DB-Loop" ist (hört sich aber ätzend an ;).

          Schönen Dank für die konstruktive Hilfe.
          Erspar mir weitere Hilfe von dir.

          Danke.
          LG
          kev1n

          --
          SELFCODE:
          sh:( fo:| ch:? rl:° br:^ ie:{ mo:| va:) de:] zu:) ss:| ls:[ js:|
          ---
          1. Schönen Dank für die konstruktive Hilfe.
            Erspar mir weitere Hilfe von dir.

            Sei doch nicht undankbar, ich wollte Dir lehren zwischen Datenzugriff und Datenformatierung zu trennen. Das ist Grundwissen, Kurs 1 so zu sagen.

            Woran hapert es denn genau? Willst Du eine komplexe SQL-Abfrage schreiben, die die Datenformatierung einschliesst? Sollen wir uns mal daran zusammen versuchen? Wie weit bist Du gekommen? Welches RDBMS steht uns z.V.? Haben wir stored procedures? Haben wir SQL-seitig Programmflusskontrolle?

          2. Weißt du was vLib ist?

            Nö, ich weiss auch nicht was ein "DB-Loop" ist (hört sich aber ätzend an ;).

            Schönen Dank für die konstruktive Hilfe.
            Erspar mir weitere Hilfe von dir.

            Ach so, es geht um die Template Engine vLib, ich dachte Du wolltest die Abfrage anpassen. Wähle nächstes Mal nicht den Themenbereich DATENBANK. Ja, Du musst dann wohl ein "IF" und einen "Merker" in vLib programmieren.   ;)

            1. Ach so, es geht um die Template Engine vLib, ich dachte Du wolltest die Abfrage anpassen. Wähle nächstes Mal nicht den Themenbereich DATENBANK. Ja, Du musst dann wohl ein "IF" und einen "Merker" in vLib programmieren.   ;)

              Oder das Array per PHP vorbearbeiten und in vLib einen Inner und Outer Loop machen.

  2. Wo kann ich da ansetzten?
    Schon am Query oder muß ich das über das vLib lösen?

    Mit einer Abfrage wirst du das nicht hinbekommen, du wirst wohl oder übel p1 miteinander vergleichen und bei Änderung entsprechend reagieren müssen.

    Siechfred

    --
    Ein Selbständiger ist jemand, der bereit ist, 16 Stunden am Tag zu arbeiten, nur um nicht 8 Stunden für einen Anderen arbeiten zu müssen.
    1. Wo kann ich da ansetzten?
      Schon am Query oder muß ich das über das vLib lösen?

      Mit einer Abfrage wirst du das nicht hinbekommen, du wirst wohl oder übel p1 miteinander vergleichen und bei Änderung entsprechend reagieren müssen.

      Habe ich da was nicht verstanden oder reicht eine Abfrage mit anschliessender Formatierung bei der Ausgabe?

    2. Hallo liebe SELFHTMLer,

      Wo kann ich da ansetzten?
      Schon am Query oder muß ich das über das vLib lösen?

      Mit einer Abfrage wirst du das nicht hinbekommen, du wirst wohl oder übel p1 miteinander vergleichen und bei Änderung entsprechend reagieren müssen.

      Siechfred

      Ud was gäbe es für Möglichkeiten, wenn ich die Sruktur der Datenbanktabelle ändere?

      LG
      kev1n

      --
      SELFCODE:
      sh:( fo:| ch:? rl:° br:^ ie:{ mo:| va:) de:] zu:) ss:| ls:[ js:|
      ---
      1. Ud was gäbe es für Möglichkeiten, wenn ich die Sruktur der Datenbanktabelle ändere?

        Das scheint mir wenig konstruktiv zu sein, die Datenliegen doch semantisch richtig vor (bzw. normalisiert), oder?

        Wir wollen doch nicht die Datenstruktur ändern um eine bestimmte Ausgabe zu erhalten, der Datenzugriff sollte nie das datendesign bestimmen.

  3. yo,

    GROUP BY in verbindung mit GROUP_CONCAT könnte das leisten. du gruppierst über die spalte p1, somit  bekommst nur soviele datensätze zurück wie es unterschiedliche werte in p1 gibt. die anderen spalten werden dann über die aggregat-funktion GROUP_CONCAT zusammgenfügt, eventuell noch mit einen Sondernzeichen zum Zeilenumbruch.

    mysql beherscht diese aggregat-funltion und unter oracle gibt es je nach version einige work-arounds, die eine solche agregat-funktion abbilden können.

    Ilja

    1. Hallo liebe SELFHTMLer,

      yo,

      GROUP BY in verbindung mit GROUP_CONCAT könnte das leisten. du gruppierst über die spalte p1, somit  bekommst nur soviele datensätze zurück wie es unterschiedliche werte in p1 gibt. die anderen spalten werden dann über die aggregat-funktion GROUP_CONCAT zusammgenfügt, eventuell noch mit einen Sondernzeichen zum Zeilenumbruch.

      mysql beherscht diese aggregat-funltion und unter oracle gibt es je nach version einige work-arounds, die eine solche agregat-funktion abbilden können.

      Ilja

      Vielen Dank,
      das werde ich ausprobieren, und bei Erfolg mich mit der Lösung hier nochmals blicken lassen.

      LG
      kev1n

      --
      SELFCODE:
      sh:( fo:| ch:? rl:° br:^ ie:{ mo:| va:) de:] zu:) ss:| ls:[ js:|
      ---
    2. Hallo liebe SELFHTMLer,

      das Ergebniss ist ersteinmal das was ich wollte.
      Jetzt wirds kompliziert!

      Also so sieht der Query jetzt aus:
      $sql = mysql_query ('SELECT id,playerid,universum,p1,GROUP_CONCAT(p2 SEPARATOR "|||") as p2,GROUP_CONCAT(p3 SEPARATOR "|||") as p3 FROM hsp GROUP BY p1 ORDER BY universum,p1 ASC' );

      p1, p2 und p3 gehören pro Datensatz immer zusammen.

      Als Bsp.:
      p1 = 2
      p2 = 22
      p3 = 222

      Als gewünschte Ausgabe

      p1:p2:p3

      also so:

      2:22:222

      Nun wollte ich ja das alle p2 und p3 in dem Haupplaneten p1 gruppiert werden.

      Bsp.:
      erster Datensatz:
      p1 = 2
      p2 = 22
      p3 = 222

      zweiter Datensatz:
      p1 = 2
      p2 = 23
      p3 = 223

      dritter Datensatz:
      p1 = 1
      p2 = 2
      p3 = 3

      Ich will die Ausgabe so gestalten:

      <h1>p1</h1>
      <ul>
      <li>p2:p3</p>
      </ul>

      Funktioniert auch, nur das eben bei der Gruppierung es mit o.g. Beispielen so ausschaut.

      1
      2:3

      2
      22|||23:222|||223

      Kann ich den Query nun noch so umbauen das er ihn mir gleich in irgendeiner form formatiert?
      Ziel soll so aussehen:

      1
      2:3

      2
      22:222
      23:223

      LG
      kev1n

      --
      SELFCODE:
      sh:( fo:| ch:? rl:° br:^ ie:{ mo:| va:) de:] zu:) ss:| ls:[ js:|
      ---
      1.   
        SELECT  
         id,  
         playerid,  
         universum,  
         p1,  
         GROUP_CONCAT(p2 SEPARATOR "|||") as p2,  
         GROUP_CONCAT(p3 SEPARATOR "|||") as p3  
        FROM  
         hsp  
        GROUP BY  
         p1  
        ORDER BY  
         universum ASC,  
         p1 ASC  
        
        

        http://dev.mysql.com/doc/refman/5.1/en/group-by-functions.html#function_group-concat

        Du willst doch eine bestimmte Formatierug der datensatzmenge, also aus bspw.
          1 2 3
          1 3 4
          2 4 5
          3 5 6
        soll
          1
          2 3
          3 4
          2
          4 5
          3
          5 6
        werden, also ich wüsste nicht wie Du das mit GROUP CONCAT hinkriegen willst.

        Für komplexere Formatierungen sind oft Läufe über ein Recordset erforderlich mit Merkern und so, da empfehle ich dringend entweder eine stored procedure oder eine Formatierung per serverseitiger Logik, also per PHP bspw..
        Datenserver sollten m.E. nicht formatieren und die Ausgabe festlegen.