• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

ORDER BY mit CASE

Status
Für weitere Antworten geschlossen.
So, es hat tatsächlich mit der CAST Methode funktioniert, der Code sieht jetzt so aus:
PHP:
ORDER BY
CASE WHEN ergebnis NOT LIKE '' THEN disziplinen.reihenfolge END ASC,
CASE WHEN ergebnis LIKE '%m' AND ergebnisse.dkuerzel NOT LIKE 'hs' AND ergebnisse.dkuerzel NOT LIKE 'ws' AND ergebnisse.dkuerzel NOT LIKE 'sh' THEN CAST(ergebnis AS UNSIGNED) END DESC,
CASE WHEN ergebnis LIKE '%m' AND ergebnisse.dkuerzel NOT LIKE '%ks%' AND ergebnisse.dkuerzel NOT LIKE '%sw%' AND ergebnisse.dkuerzel NOT LIKE '%hw%' AND ergebnisse.dkuerzel NOT LIKE '%bw%' AND ergebnisse.dkuerzel NOT LIKE '%dw%' THEN ergebnis END DESC,
CASE WHEN ergebnis LIKE '%sec%' THEN ergebnis END ASC,
CASE WHEN ergebnis LIKE '%min%' THEN ergebnis END ASC,
CASE WHEN ergebnis LIKE '%Std%' THEN ergebnis END ASC,
CASE WHEN ergebnis LIKE '%Pkt%' THEN ergebnis END DESC
 
Werbung:
So, die Lösung mit CAST ist mir schon zu aufwendig geworden...

Jetzt habe ich mich daran gemacht und aus den Ergebnissen die Endungen (m, sec. etc.) gelöscht, eine neue Spalte mit den entsprechenden Abkürzungen angelegt und alle Kommata duch Punkte ersetzt. Nun wollte ich die Spalte "ergebnis" in den Typ float umwandeln, da mir das passend schien. Allerdings werden jetzt die Zahlen die einen Doppelpunkt enthalten, also bspw. eine Marathonzeit (3:10.12 für 3h 10min. und 12sec.), nur bis zu dem Doppelpunkt dargestellt. Also eine 3. Das ist nicht wirklich zufriedenstellend.
Da ich den Punkt per PHP bei der Ausgabe durch ein Komma ersetzen möchte, dachte ich dass so etwas vielleicht auch mit dem Doppelpunkt möglich sein könnte... Aber welches Zeichen kann ich da verwenden? Oder gibt es einen Spaltentyp, der Zahlen richtig sortiert UND einen Doppelpunkt akzeptiert? Oder könnte man hier prüfen ob die Zeit zwei Punkte enthält und dann den ersten durch einen Doppelpunkt ersetzen?

Zweites Problem: Wenn eine Zeit auf Null endet, also bspw. 10.00, dann wird nur eine 10 angezeigt. Ich würde aber die Nullen auch gerne anzeigen.... Eine Lösung wie "prüfen ob es eine Laufzeit ist und diese normalerweise so und so viele Stellen hat und den Rest mit Nullen füllen" geht mMn. nicht, da es auch handgestoppte Zeiten gibt, die nur bis zu Zehntelsekunden gehen.

Vielen Dank schonmal für Vorschläge!
 
So, ich habe jetzt (fast) eine gut funktionierende Lösung gefunden:
Ich habe in den gesamten Ergebnissen die Kommata und Doppelpunkte durch Punkte ersetzt. Dann habe ich, wenn zwei Punkte in einem Ergebnis waren, den zweiten gelöscht. Nun habe ich also lauter Zahlen, in denen die Position des ersten "Trennzeichens" durch einen Punkt markiert ist. Nun habe ich es auch schon hinbekommen, dass die Punkte durch Kommata bzw. Doppelpunkte ersetzt werden, je nachdem, was für ein Ergebnis vorliegt. Auch bei den Zeiten, die ein zweites Trennzeichen benötigen, habe ich diese per PHP eingefügt bekommen.

Aber der Spaltentyp ist immer noch Varchar, da ich bei den Typen Float und Double die Nachkommastellen, die ich angebe, aufgefüllt bekomme... Wenn ich also zwei Zeiten habe:

12.45
2.3832

Sind da ja unterschiedliche Anzahlen Nachkommastellen vorhanden (Das obere sei eine 100m Zeit, das untere meinetwegen eine Marathonzeit). Wenn ich jetzt double(12,6) nutze, werden 6 Stellen hinter dem Komma angezeigt. Sind die nicht vorhanden, wird mit Nullen aufgefüllt, also so:

12.450000
2.383200

Das ist aber nicht gewünscht, wie ihr euch denken könnt. Wenn ich nun float(12) oder Ähnliches nutze, dann zeigt er mir schön die Nachkommastellen an, allerdings nicht, wenn die letzte Stelle eine Null ist. Diese entfernt er. Also aus 12.40 wird 12.4, aus 12.00 wird 12 usw.

Hier also meine Frage: Gibt es einen numerischen Spaltentypen in mysql, der die Nachkommastellen (auch Nullen am Ende) anzeigt?
 
Werbung:
Hat niemand eine Idee?

Oder ist es vielleicht möglich mit PHP zu ermitteln, welche Nullen als Nachkommastellen "nachträglich" durch den Spaltentyp hinzugefügt wurden, damit man diese dann entfernen kann?
 
Ich würde den Spaltentyp double verwenden und bei der Ausgabe die Zahl mittels CAST() so formatieren wie ich sie gerne hätte. So hast Du in der Datenbank auch die Möglichkeit deutlich größere Zahlen (vor allem auch mit Nachkommastellen) zu erfassen und könntest gleichzeitig in der Ausgabe es so regeln wie Du es gerne dort hättest.
 
Also würdest du sämtliche Zahlen ohne Punkt eintragen? Und durch die CAST Methode wird dann auch wirklich jede Zahl beim sortieren so behandelt, als ob der Punkt da schon in der db gestanden hätte?

Denn ich hatte schon einen Versuch ohne Punkte, wo dann aber diese Laufzeiten (117, 1150) logischerweise so sortiert wurden:

11,7 sec.
11,50 sec.

Aber es soll ja genau andersrum sein, die kleinste Zahl oben. Bei dieser Methode habe ich aber versucht, das mit PHP zu lösen und nicht in der mysql Ausgabe.

Edit: Oder habe ich es falsch verstanden?
 
Werbung:
Wenn Du die Zahl auch zum Sortieren verwenden willst, kannst Du sie innerhalb von ORDER BY auch per CAST zu einem einheitlichen Format für die Sortierung formatieren. Es kommt drauf an wie Du CAST in deinem Statement definierst, ob dort nun Kommazahlen enthalten sind oder nicht. CAST bietet nur den Rahmen, die Konfiguration zur Umrechnung musst Du angeben. Siehe Manual:
MySQL :: MySQL 5.0 Reference Manual :: 12.10 Cast Functions and Operators

In deinem Fall könnte DECIMAL hier vermutlich interessant sein. Einige Beispiele gibt es hier:
How to Use MySQL Conversion Functions - CONVERT, CAST, BINARY
 
Es funktioniert (so wie ich es versucht habe) nicht wirklich.
Ich habe zuerst den Typ der Spalte auf DOUBLE umgestellt. In der Ausgabe wird jetzt alles toll sortiert ausgegeben. Allerdings habe ich nun wieder das Problem, dass die Nullen am Ende weg sind.
Dann habe ich versucht, die Spalte per CAST in Numeric umzuwandeln. Das bringt keinerlei Veränderung, und wenn ich das mit einem Varchar-Feld mache, ist die Sortierung nicht korrekt, ich weiß nicht genau, nach was da sortiert wird. (Vielleicht geht das auch gar nicht?)

Ich hatte nun überlegt, die Zeichen zu zählen und dann je nach Ergebnis noch Nullen dranzuhängen. Aber das kann doch nicht der Weisheit letzter Schluss sein? Gibt es irgendeinen Befehl oder "Operator", den man direkt in das Datenbankfeld eingeben kann, damit die Null(en) am Ende nicht wegfällt?

Vielleicht steh' ich ein wenig auf dem Schlauch, wenn ja, dann tut's mir Leid.

Über weitere Ansätze würde ich mich sehr freuen...
 
So, ich habe nun eine (für mich) zufriedenstellende Lösung gefunden. Ich habe die Ergebnisspalte als Varchar gelassen, aber im Dezimalzahlsystem. Beim Auslesen lasse ich dann die Spalte nocheinmal als DEZIMAL Typ ausgeben, und nach dieser kann ich dann sortieren. Auf der Seite selber gebe ich dann die Varchar Spalte aus, die ich dann mit PHP noch nach meinen Wünschen formatiere.

So sieht das ganze beispielhaft dür die Ergebnisse der Männer aus:
PHP:
require_once ('config-statistik-test.php');
$sql = "SELECT  *,CAST(ergebnis AS DECIMAL(12,6)) as ergebnis_nummer FROM ergebnisse
JOIN athleten ON ergebnisse.skuerzel = athleten.skuerzel
JOIN athleten1 ON ergebnisse.skuerzel1 = athleten1.skuerzel1
JOIN athleten2 ON ergebnisse.skuerzel2 = athleten2.skuerzel2
JOIN athleten3 ON ergebnisse.skuerzel3 = athleten3.skuerzel3
JOIN athleten4 ON ergebnisse.skuerzel4 = athleten4.skuerzel4
JOIN disziplinen ON ergebnisse.dkuerzel= disziplinen.dkuerzel
JOIN altersklassen ON ergebnisse.akuerzel = altersklassen.akuerzel
JOIN endungen ON disziplinen.endung_kurz = endungen.kurz
WHERE ergebnisse.akuerzel='m'
AND jahr=12
ORDER BY
CASE WHEN ergebnis NOT LIKE '' THEN disziplinen.reihenfolge  END ASC,
CASE WHEN endung_kurz LIKE 'm' THEN ergebnis_nummer END DESC,
CASE WHEN endung_kurz LIKE 'p' THEN ergebnis_nummer END DESC,
CASE WHEN endung_kurz NOT LIKE 'm' THEN ergebnis_nummer END ASC";
$db_erg = mysql_query( $sql );
if ( ! $db_erg )
{
die('Ungültige Abfrage: ' . mysql_error());
}
echo '<table>';
$wertalt = "";
while ($zeile = mysql_fetch_array( $db_erg, MYSQL_ASSOC)){
    $str = strlen($zeile['ergebnis']);
    $position_punkt = strpos($zeile['ergebnis'], '.');
    $minus = $str - $position_punkt;
    if($zeile['endung'] === "m"){
        $ergebnis = str_replace('.',',',$zeile['ergebnis']);
    }elseif($zeile['endung'] === "min." && $minus > 3){
        $ergebnis_neu = substr($zeile['ergebnis'], 0, 3+$position_punkt).",".substr($zeile['ergebnis'], 3+$position_punkt);
        $ergebnis = str_replace('.',':',$ergebnis_neu);
    }elseif($zeile['endung'] === "min." && $minus > 2){
        $ergebnis = str_replace('.',':',$zeile['ergebnis']);
    }elseif($zeile['endung'] === "sec."){
        $ergebnis = str_replace('.',',',$zeile['ergebnis']);
    }elseif($zeile['endung'] === "Pkt." && $str ===4 ){
        $ergebnis = substr($zeile['ergebnis'], 0,1).".".substr($zeile['ergebnis'], 1);
    }elseif($zeile['endung'] === "Pkt." && $str ===5 ){
        $ergebnis = substr($zeile['ergebnis'], 0,2).".".substr($zeile['ergebnis'], 2);
    }elseif($zeile['endung'] === "Pkt."){
        $ergebnis = $zeile['ergebnis'];
    }elseif($zeile['endung'] === "Std." && $minus > 3){
        $ergebnis_neu = substr($zeile['ergebnis'], 0, 3+$position_punkt).",".substr($zeile['ergebnis'], 3+$position_punkt);
        $ergebnis = str_replace('.',':',$ergebnis_neu);
    }
    echo "<tr>";
    if( $wertalt != $zeile['disziplin' ] ) {
        echo "<td>". $zeile['disziplin'] . "</td>";
    }else{
        echo"<td></td>"; 
    }
    $wertalt = $zeile['disziplin'];
    echo "<td>". $ergebnis ." ".$zeile['endung'] . "</td>";echo "<td>". $zeile['athlet'];
if($zeile['athlet4'] != ''){
    echo "<br />". $zeile['athlet1'];
    echo "<br />". $zeile['athlet2'];
    echo "<br />". $zeile['athlet3'];
    echo "<br />". $zeile['athlet4'];
}elseif($zeile['athlet3'] != ''){
    echo "<br />". $zeile['athlet1'];
    echo "<br />". $zeile['athlet2'];
    echo "<br />". $zeile['athlet3'];
}elseif($zeile['athlet2'] != ''){
    echo "<br />". $zeile['athlet1'];
    echo "<br />". $zeile['athlet2'];
}
echo "</td>";
echo "<td>";
if($zeile['athlet2'] == ''){
    echo $zeile['jahrgang'];
}
echo"</td>";
echo "<td>".$zeile['ort'].", " .$zeile['tag'].".".$zeile['monat'] . "</td>";

echo "</tr>";
}
echo "</table>";
mysql_free_result( $db_erg );

?>

Vielen Dank threadi, dein Tipp mit dem CAST hat mir im Nachhinein doch sehr geholfen!
 
Werbung:
Ich habe noch eine kleine Frage...
Abgesehen davon, dass mir die Lösung mit den 5 Athletentabellen immer noch nicht ganz gefällt, würde ich gerne die einzelnen Altersklassenabfragen in einer zusammenfassen. Also statt immer folgendes für jede Altersklassen zu schreiben:
PHP:
$sql = "SELECT  *,CAST(ergebnis AS DECIMAL(12,6)) as ergebnis_nummer FROM ergebnisse
JOIN athleten ON ergebnisse.skuerzel = athleten.skuerzel
JOIN athleten1 ON ergebnisse.skuerzel1 = athleten1.skuerzel1
JOIN athleten2 ON ergebnisse.skuerzel2 = athleten2.skuerzel2
JOIN athleten3 ON ergebnisse.skuerzel3 = athleten3.skuerzel3
JOIN athleten4 ON ergebnisse.skuerzel4 = athleten4.skuerzel4
JOIN disziplinen ON ergebnisse.dkuerzel= disziplinen.dkuerzel
JOIN altersklassen ON ergebnisse.akuerzel = altersklassen.akuerzel
JOIN endungen ON disziplinen.endung_kurz = endungen.kurz
WHERE ergebnisse.akuerzel='m'
AND jahr=12
ORDER BY
CASE WHEN ergebnis NOT LIKE '' THEN disziplinen.reihenfolge  END ASC,
CASE WHEN endung_kurz LIKE 'm' THEN ergebnis_nummer END DESC,
CASE WHEN endung_kurz LIKE 'p' THEN ergebnis_nummer END DESC,
CASE WHEN endung_kurz NOT LIKE 'm' THEN ergebnis_nummer END ASC";
$db_erg = mysql_query( $sql );
if ( ! $db_erg )
{
die('Ungültige Abfrage: ' . mysql_error());
}
echo '<table>';
$wertalt = "";
while ($zeile = mysql_fetch_array( $db_erg, MYSQL_ASSOC)){
    $str = strlen($zeile['ergebnis']);
    $position_punkt = strpos($zeile['ergebnis'], '.');
    $minus = $str - $position_punkt;
    if($zeile['endung'] === "m"){
        $ergebnis = str_replace('.',',',$zeile['ergebnis']);
    }elseif($zeile['endung'] === "min." && $minus > 3){
        $ergebnis_neu = substr($zeile['ergebnis'], 0, 3+$position_punkt).",".substr($zeile['ergebnis'], 3+$position_punkt);
        $ergebnis = str_replace('.',':',$ergebnis_neu);
    }elseif($zeile['endung'] === "min." && $minus > 2){
        $ergebnis = str_replace('.',':',$zeile['ergebnis']);
    }elseif($zeile['endung'] === "sec."){
        $ergebnis = str_replace('.',',',$zeile['ergebnis']);
    }elseif($zeile['endung'] === "Pkt." && $str ===4 ){
        $ergebnis = substr($zeile['ergebnis'], 0,1).".".substr($zeile['ergebnis'], 1);
    }elseif($zeile['endung'] === "Pkt." && $str ===5 ){
        $ergebnis = substr($zeile['ergebnis'], 0,2).".".substr($zeile['ergebnis'], 2);
    }elseif($zeile['endung'] === "Pkt."){
        $ergebnis = $zeile['ergebnis'];
    }elseif($zeile['endung'] === "Std." && $minus > 3){
        $ergebnis_neu = substr($zeile['ergebnis'], 0, 3+$position_punkt).",".substr($zeile['ergebnis'], 3+$position_punkt);
        $ergebnis = str_replace('.',':',$ergebnis_neu);
    }
    echo "<tr>";
    if( $wertalt != $zeile['disziplin' ] ) {
        echo "<td>". $zeile['disziplin'] . "</td>";
    }else{
        echo"<td></td>"; 
    }
    $wertalt = $zeile['disziplin'];
    echo "<td>". $ergebnis ." ".$zeile['endung'] . "</td>";echo "<td>". $zeile['athlet'];
if($zeile['athlet4'] != ''){
    echo "<br />". $zeile['athlet1'];
    echo "<br />". $zeile['athlet2'];
    echo "<br />". $zeile['athlet3'];
    echo "<br />". $zeile['athlet4'];
}elseif($zeile['athlet3'] != ''){
    echo "<br />". $zeile['athlet1'];
    echo "<br />". $zeile['athlet2'];
    echo "<br />". $zeile['athlet3'];
}elseif($zeile['athlet2'] != ''){
    echo "<br />". $zeile['athlet1'];
    echo "<br />". $zeile['athlet2'];
}
echo "</td>";
echo "<td>";
if($zeile['athlet2'] == ''){
    echo $zeile['jahrgang'];
}
echo"</td>";
echo "<td>".$zeile['ort'].", " .$zeile['tag'].".".$zeile['monat'] . "</td>";

echo "</tr>";
}
echo "</table>";
mysql_free_result( $db_erg );
Würde ich gerne nur eine einzige Abfrage machen. Diese sähe dann für das Beispiel mit den Wettkampfergebnissen von 2012 so aus (es ändert sich nur, dass nicht zusätzlich nach den Altersklassen gefiltert wird):
PHP:
$sql = "SELECT  *,CAST(ergebnis AS DECIMAL(12,6)) as ergebnis_nummer FROM ergebnisse
JOIN athleten ON ergebnisse.skuerzel = athleten.skuerzel
JOIN athleten1 ON ergebnisse.skuerzel1 = athleten1.skuerzel1
JOIN athleten2 ON ergebnisse.skuerzel2 = athleten2.skuerzel2
JOIN athleten3 ON ergebnisse.skuerzel3 = athleten3.skuerzel3
JOIN athleten4 ON ergebnisse.skuerzel4 = athleten4.skuerzel4
JOIN disziplinen ON ergebnisse.dkuerzel= disziplinen.dkuerzel
JOIN altersklassen ON ergebnisse.akuerzel = altersklassen.akuerzel
JOIN endungen ON disziplinen.endung_kurz = endungen.kurz
WHERE jahr=12
ORDER BY
CASE WHEN ergebnis NOT LIKE '' THEN disziplinen.reihenfolge  END ASC,
CASE WHEN endung_kurz LIKE 'm' THEN ergebnis_nummer END DESC,
CASE WHEN endung_kurz LIKE 'p' THEN ergebnis_nummer END DESC,
CASE WHEN endung_kurz NOT LIKE 'm' THEN ergebnis_nummer END ASC";
Nun hätte ich als Ergebnis sämtliche Ergebnisse aus dem Jahr 2012. Die Ausgabe soll wie folgt aussehen: Eine Überschrift (h3) mit der jeweilig folgende Altersklasse. Danach kommt eine Tabelle mit den Ergebnissen der Altersklasse und danach wieder h3 und dann die nächste Tabelle.
Also müsste der Teil der Ausgabe irgendwie so aussehen, dass ich um die Abfrageschleife für die Tabellenzeilen noch eine Abfrage rumbekomme, die dann immer die jeweilige Überschrift ausgibt. Nur weiß ich da nicht genau, wie ich das anstellen soll. Mit if/else irgendwie überprüfen, ob das nächste Ergebnis von einer anderen Altersklasse ist, und dann diese davor in Form einer Überschrift ausgeben?

Kann mir da jemand helfen?
 
hi,

verwende in deiner Schleife temporäre Variablen um dies zu erreichen - ich hab's jetzt nur so ungefähr hingeschrieben

PHP:
while ($row = mysql_fetch_object($res)) {
    if ($row->jahr != $tmp_jahr) echo "<h3>" . $row->jahr . "</h3>\n";

   /* deine Tabellen und mehr
   ... */

   $tmp_jahr = $row->jahr;
}

hoffe dieser Denkanstoß hilft

lg
mac
 
Werbung:
Also, ich bin jetzt bereits ein gutes Stück weitergekommen, habe jetzt aber einen Hänger. Die momentane Situation ist, dass mir schön die Ergebnisse der einzelnen Altersklassen mit h3-Überschrift ausgegeben werden. Weniger schön ist, dass die erste Altersklass4e davon unbeeindruckt bleibt. Also die Altersklasse "Männer" wird nicht unter der angezeigten Überschrift "m" gelistet, sondern unter der nachfolgenden, also bei "mju20" (die Altersklasse unter den Männern). Unter der Überschrift der Männer wird überhaupt nichts angezeigt... Hier mal der Quellcode:
PHP:
require_once ('config-statistik.php');
$sql = "SELECT  *,CAST(ergebnis AS DECIMAL(12,6)) as ergebnis_nummer FROM ergebnisse
JOIN athleten ON ergebnisse.skuerzel = athleten.skuerzel
JOIN athleten1 ON ergebnisse.skuerzel1 = athleten1.skuerzel1
JOIN athleten2 ON ergebnisse.skuerzel2 = athleten2.skuerzel2
JOIN athleten3 ON ergebnisse.skuerzel3 = athleten3.skuerzel3
JOIN athleten4 ON ergebnisse.skuerzel4 = athleten4.skuerzel4
JOIN disziplinen ON ergebnisse.dkuerzel= disziplinen.dkuerzel
JOIN altersklassen ON ergebnisse.akuerzel = altersklassen.akuerzel
JOIN endungen ON disziplinen.endung_kurz = endungen.kurz
WHERE jahr='12'
ORDER BY
CASE WHEN ergebnis NOT LIKE '' THEN altersklassen.reihenfolge END ASC,
CASE WHEN ergebnis NOT LIKE '' THEN disziplinen.reihenfolge  END ASC,
CASE WHEN endung_kurz LIKE 'm' THEN ergebnis_nummer END DESC,
CASE WHEN endung_kurz LIKE 'p' THEN ergebnis_nummer END DESC,
CASE WHEN endung_kurz NOT LIKE 'm' THEN ergebnis_nummer END ASC";
$db_erg = mysql_query( $sql );
if ( ! $db_erg ){
    die('Ungültige Abfrage: ' . mysql_error());
}

$wertalt = "";
$altersklasse = "";
while ($zeile = mysql_fetch_array( $db_erg, MYSQL_ASSOC)){
    if($zeile['akuerzel'] != $altersklasse){
        echo"<h3>".$zeile['akuerzel']."</h3>";
        echo"<table class='resposive'>";
    }
    $altersklasse = $zeile['akuerzel'];
    $str = strlen($zeile['ergebnis']);
    $position_punkt = strpos($zeile['ergebnis'], '.');
    $minus = $str - $position_punkt;
    if($zeile['endung'] === "m"){
        $ergebnis = str_replace('.',',',$zeile['ergebnis']);
    }elseif($zeile['endung'] === "min." && $minus > 3){
        $ergebnis_neu = substr($zeile['ergebnis'], 0, 3+$position_punkt).",".substr($zeile['ergebnis'], 3+$position_punkt);
        $ergebnis = str_replace('.',':',$ergebnis_neu);
    }elseif($zeile['endung'] === "min." && $minus > 2){
        $ergebnis = str_replace('.',':',$zeile['ergebnis']);
    }elseif($zeile['endung'] === "sec."){
        $ergebnis = str_replace('.',',',$zeile['ergebnis']);
    }elseif($zeile['endung'] === "Pkt." && $str ===4 ){
        $ergebnis = substr($zeile['ergebnis'], 0,1).".".substr($zeile['ergebnis'], 1);
    }elseif($zeile['endung'] === "Pkt." && $str ===5 ){
        $ergebnis = substr($zeile['ergebnis'], 0,2).".".substr($zeile['ergebnis'], 2);
    }elseif($zeile['endung'] === "Pkt."){
        $ergebnis = $zeile['ergebnis'];
    }elseif($zeile['endung'] === "Std." && $minus > 3){
        $ergebnis_neu = substr($zeile['ergebnis'], 0, 3+$position_punkt).",".substr($zeile['ergebnis'], 3+$position_punkt);
        $ergebnis = str_replace('.',':',$ergebnis_neu);
    }
    
    
    echo "<tr>";
    if( $wertalt != $zeile['disziplin' ] ) {
        echo "<td>". $zeile['disziplin'] . "</td>";
    }else{
        echo"<td></td>";
    }
    $wertalt = $zeile['disziplin'];
    echo "<td>". $ergebnis ." ".$zeile['endung'] . "</td>";echo "<td>". $zeile['athlet'];
    if($zeile['athlet4'] != ''){
        echo "<br />". $zeile['athlet1'];
        echo "<br />". $zeile['athlet2'];
        echo "<br />". $zeile['athlet3'];
        echo "<br />". $zeile['athlet4'];
    }elseif($zeile['athlet3'] != ''){
        echo "<br />". $zeile['athlet1'];
        echo "<br />". $zeile['athlet2'];
           echo "<br />". $zeile['athlet3'];
    }elseif($zeile['athlet2'] != ''){
        echo "<br />". $zeile['athlet1'];
        echo "<br />". $zeile['athlet2'];
    }
    echo "</td>";
    echo "<td>".$zeile['ort'].", " .$zeile['tag'].".".$zeile['monat'] .".".$zeile['jahr'] . "</td>";
    echo "</tr>";
}

mysql_free_result( $db_erg );
Außerdem stehe ich noch vor der Frage, wie ich den schließenden table-Tag einbinden kann...
 
hi,

ich geh mal nur auf den table Teil ein :) - vlt. ergibt es sich der Rest dann mit dem korrekten Output

PHP:
while (.... {
   if($zeile['akuerzel'] != $altersklasse){
        if ($altersklasse) echo "</table>"
        echo"<h3>".$zeile['akuerzel']."</h3>";
        echo"<table class='resposive'>";
    }
   ...
   ...
} //while
echo "</table>";

lg
mac
 
Werbung:
So, nach etwas längerer Zeit habe ich mich nun nochmal dran gesetzt und eine Lösung gefunden.
Der SQL-Teil ist wie oben, der leicht veränderte PHP-Code:

PHP:
$db_erg = mysql_query( $sql );
if ( ! $db_erg ){
    die('Ungültige Abfrage: ' . mysql_error());
}

$wertalt = "";
$altersklasse = "";
while ($zeile = mysql_fetch_array( $db_erg, MYSQL_ASSOC)){
    if($zeile['akuerzel'] != $altersklasse){
        if($altersklasse != ""){
            echo"</table>";
            $wertalt="";
        }
        echo"<h3>".$zeile['altersklasse']."</h3>";
        echo"<table class='responsive'>";
    }
    $altersklasse = $zeile['akuerzel'];
    $str = strlen($zeile['ergebnis']);
    $position_punkt = strpos($zeile['ergebnis'], '.');
    $minus = $str - $position_punkt;
    if($zeile['endung'] === "m"){
        $ergebnis = str_replace('.',',',$zeile['ergebnis']);
    }elseif($zeile['endung'] === "min." && $minus > 3){
        $ergebnis_neu = substr($zeile['ergebnis'], 0, 3+$position_punkt).",".substr($zeile['ergebnis'], 3+$position_punkt);
        $ergebnis = str_replace('.',':',$ergebnis_neu);
    }elseif($zeile['endung'] === "min." && $minus > 2){
        $ergebnis = str_replace('.',':',$zeile['ergebnis']);
    }elseif($zeile['endung'] === "sec."){
        $ergebnis = str_replace('.',',',$zeile['ergebnis']);
    }elseif($zeile['endung'] === "Pkt." && $str ===4 ){
        $ergebnis = substr($zeile['ergebnis'], 0,1).".".substr($zeile['ergebnis'], 1);
    }elseif($zeile['endung'] === "Pkt." && $str ===5 ){
        $ergebnis = substr($zeile['ergebnis'], 0,2).".".substr($zeile['ergebnis'], 2);
    }elseif($zeile['endung'] === "Pkt."){
        $ergebnis = $zeile['ergebnis'];
    }elseif($zeile['endung'] === "Std." && $minus > 3){
        $ergebnis_neu = substr($zeile['ergebnis'], 0, 3+$position_punkt).",".substr($zeile['ergebnis'], 3+$position_punkt);
        $ergebnis = str_replace('.',':',$ergebnis_neu);
    }
    
    
    echo "<tr>";
    if( $wertalt != $zeile['disziplin' ] ) {
        echo "<td>". $zeile['disziplin'] . "</td>";
    }else{
        echo"<td></td>";
    }
    $wertalt = $zeile['disziplin'];
    echo "<td>". $ergebnis ." ".$zeile['endung'] . "</td>";echo "<td>". $zeile['athlet'];
    if($zeile['athlet4'] != ''){
        echo "<br />". $zeile['athlet1'];
        echo "<br />". $zeile['athlet2'];
        echo "<br />". $zeile['athlet3'];
        echo "<br />". $zeile['athlet4'];
    }elseif($zeile['athlet3'] != ''){
        echo "<br />". $zeile['athlet1'];
        echo "<br />". $zeile['athlet2'];
        echo "<br />". $zeile['athlet3'];
    }elseif($zeile['athlet2'] != ''){
        echo "<br />". $zeile['athlet1'];
        echo "<br />". $zeile['athlet2'];
    }
    echo "</td>";
    echo "<td>";
    if($zeile['athlet2'] == ''){
        echo $zeile['jahrgang'];
    }
    echo"</td>";
    echo "<td>".$zeile['ort'].", " .$zeile['tag'].".".$zeile['monat'] . "</td>";
    echo "</tr>";
}
echo"</table>";
mysql_free_result( $db_erg );
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben