GROUP BY, DISTINCT, ORDER BY
kEv*
- datenbank
0 King^Lully0 kEv*0 King^Lully0 kEv*0 King^Lully0 King^Lully
0 Siechfred0 King^Lully0 kEv*
1 Ilja
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
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.
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
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 ;).
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
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?
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. ;)
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.
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
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?
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
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.
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
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
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
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.