Zur Navigation

Sortierung und Numerierung

1 tobi

Hallo,

ich habe in einer Datenbank 4 Spalten. id, status, name und einsaetze.

In der Spalte einsaetze stehen Zahlen von 0 bis 1000. Aktuell habe ich versucht dies so um zu setzen.
<?php

//Einbinden von CSS Datei
include "css.php.inc";

/**
* pdo extension
*/
class MyPDO extends PDO
{

    function __construct($file = 'db-config.ini')
    {
        if (!$settings = parse_ini_file($file, TRUE))
            throw new Exception("Unable to process file: " . $file);

        $dns = $settings['database']['driver'] .
            ':host=' . $settings['database']['host'] .
            ((!empty($settings['database']['port']))
                ? (';port=' . $settings['database']['port'])
                : '') .
            ';dbname=' . $settings['database']['schema'];

        $opt = [
            PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
            PDO::ATTR_EMULATE_PREPARES   => false,
            PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
        ];

        parent::__construct(
            $dns,
            $settings['database']['username'],
            $settings['database']['password'],
            $opt
        );

    }
}

$pdo_1 = new MyPDO();
$sql_1 = "
    SELECT
        id, status, name, einsaetze
    FROM
        spielerliste
    ORDER BY
        einsaetze DESC
";

try {
    printResult_1($pdo_1->query($sql_1)->fetchAll());
} catch (Exception $e) {
    die('Something went wrong...<br />' . $e->getMessage());
}
function printResult_1($res_1) {
    echo "<b>Spielerliste</b>
        <table class='table_gesamtspielplan'> 
            <tr>
                <td><b>Platz</b></td>
                <td><b>Status</b></td>
                <td><b>Name</b></td>
                <td><b>Einsätze</b></td>
             </tr>
    ";

    foreach ($res_1 as $val_1) {
        echo "
        <tr>
            <td> {$val_1["id"]} </td>
            <td> {$val_1["status"]} </td>
            <td> {$val_1["name"]} </td>
            <td> {$val_1["einsaetze"]} </td>
        </tr>
        ";
    }
    echo "</table>";
}

?>

Ergebnis ist somit:
99
98
977
97
96
959
954
946
94
93
und somit nicht ganz nach meiner Vorstellung. 959, 954, 946, ...

Wie bekomme ich dies hin?

Zweites Problem. Die id in der Datenbank geht von 1 - 548 id und ist quasi willkürlich. Die höhste Einsätzezahl müßte dann die 1 zugewiesen bekommen, die zweithöchste die 2 usw.
Wie kann man dies ausgeben?

Vielen dank.

Gruß Tobi

12.10.2017 13:20 | geändert: 12.10.2017 13:24

2 Jörg Kruse

Was für einen Datentyp hat die Spalte `einsaetze`?

Damit die Werte wie Zahlen sortiert werden, sollte es sich um einen Zahlentyp handeln, wie z.B. SMALLINT (ausreichend für Zahlen bis 32767). Bei einem Datentyp für Strings, wie z.B. VARCHAR, hätte man dagegen eine alphabetische Sortierung, was bei Telefonnummern oder Postleitzahlen Sinn machen kann, aber nicht bei Zahlen, mit denen man rechnet.

12.10.2017 13:40 | geändert: 12.10.2017 13:41

3 tobi

Mir ist gerade eingefallen, dass ich ein ähnlich Problem mit der Sortierung schon mal hatte. Hab nun gesucht und gefunden das INT damals die Lösung war.

Problem 1 ist somit gelöst.

Edit: zu langsam meine Antwort.

12.10.2017 13:44 | geändert: 12.10.2017 13:44

4 Jörg Kruse

Bei Problem 2 bin ich mir nicht sicher, ob ich dich richtig verstanden habe. Möchtest du die IDs neu in die Tabelle schreiben, geordnet nach der Anzahl der Einträge?

12.10.2017 13:56

5 tobi

In der Datenbank:
ID - Status - Name - Einsätze
1 - 0 - Muster 1 - 21
2 - 1 - Muster 2 - 1
3 - 1 - Muster 3 - 120
4 - 1 - Muster 4 - 55
5 - 0 - Muster 5 - 651
6 - 1 - Muster 6 - 999
...

Nach o.g. stehender SQL Abfrage mit dem DESC sieht es aktuell so aus:
Platz - Name - Einsätze
6 - Muster 6 - 999
5 - Muster 5 - 651
3 - Muster 3 - 120
4 - Muster 4 - 55
1 - Muster 1 - 21
2 - Muster 2 - 1

Ich hätte aber gerne eine richtige Reihenfolge.
Platz - Name - Einsätze
1 - Muster 6 - 999
2 - Muster 5 - 651
3 - Muster 3 - 120
4 - Muster 4 - 55
5 - Muster 1 - 21
6 - Muster 2 - 1

Wahrscheinlich muss dann die ID aus der Datenbank entfallen und man muß sich neu berechnen lassen.

12.10.2017 14:11 | geändert: 12.10.2017 14:11

6 Jörg Kruse

Ja, den Platz kannst du besser in PHP hochzählen:

    $i = 1;
    foreach ($res_1 as $val_1) {
        echo "
        <tr>
            <td> $i </td>
            <td> {$val_1["status"]} </td>
            <td> {$val_1["name"]} </td>
            <td> {$val_1["einsaetze"]} </td>
        </tr>
        ";
        $i++;
    }

Die ID ist auch eher datenbankintern relevant und sollte nicht geändert werden.

12.10.2017 14:15 | geändert: 12.10.2017 14:18

7 tobi

Super.

Gibt es die Möglichkeit, dass wenn 2 Namen die selbe Anzahl an Einsätze haben, dass diese die gleiche Nummer bekommen?

etwa so:
1 Mann1 959
2 Mann2 888
3 Mann3 777
3 Mann4 777
5 Mann5 555
6 Mann6 444
6 Mann7 444
6 Mann8 444
9 Mann9 440

13.10.2017 07:00

8 Jörg Kruse

Vielleicht so (ungetestet):

    $j = $i = 1;
    $einsaetze = '';
    foreach ($res_1 as $val_1) {
        if ($val_1["einsaetze"] != $einsaetze) {
            $j = $i;
        }
        echo "
        <tr>
            <td> $j </td>
            <td> {$val_1["status"]} </td>
            <td> {$val_1["name"]} </td>
            <td> {$val_1["einsaetze"]} </td>
        </tr>
        ";
        $einsaetze = $val_1["einsaetze"];
        $i++;
    }

13.10.2017 09:42

1 Forenmitglied fand diesen Beitrag gut

9 tobi

Scheint zu passen. Danke

13.10.2017 10:27

Beitrag schreiben (als Gast)

Die Antwort wird nach der Überprüfung durch einen Moderator freigeschaltet.





[BBCode-Hilfe]