Avatar billede pepsiman Juniormester
28. august 2016 - 10:01 Der er 4 kommentarer

Hvordan formel lister på vandret fra mysql?

Hej alle.
Jeg er ved i gang med at lave whist - kortspil og alle vil få point efter hver omgang. :) Og vil lave en vandret liste og udtræk point fra mysql.
Spillere vil få point hver efter dagens spil
hvordan vandret liste? hvilken metode kan jeg bruge?
flest bruger "lodret" liste
Avatar billede Slater Ekspert
28. august 2016 - 10:24 #1
Det hedder et Pivot Table. Hvis du googler "mysql pivot table" kommer der en del forslag til, hvordan det kan gøres i SQL. Men der er ingen helt simple måder at gøre det på. En almindelig relationel database er ikke beregnet til det.

Hvis du ikke skal bruge limits til sideopdeling osv., så ville jeg nok bare tage den nemmere og mere forståelige udvej at cache resultatet i en variabel, og bruge PHP til at udskrive det omvendt.

Her er et eksempel på, hvordan du kan udskrive en multidimensionel array vandret i stedet for lodret:

<?php

$data = [
    ['bob', 'bob@example.com', 100, 1],
    ['john', 'john@example.com', 200, 2],
    ['alex', 'akex@example.com', 300, 3],
];

echo '<table>';
$imax = count(current($data));
$jmax = count($data);
for ($i = 0; $i < $imax; $i++)
{
    echo '<tr>';
    for ($j = 0; $j < $jmax; $j++)
    {
        echo "<td>" . $data[$j][$i] . "</td>";
    }
    echo '</tr>';
}
echo '</table>';
Avatar billede arne_v Ekspert
28. august 2016 - 14:20 #2
Ofte drejer vandret liste sig om at udskrive i raekker hvor man kun skifter linie naar et bestemt felt aender vaerdi.
Avatar billede arne_v Ekspert
28. august 2016 - 14:28 #3
Det her eksempel viser teknikken paa en generel maade:


<?php
/*

CREATE TABLE whist (round INTEGER NOT NULL, player VARCHAR(50) NOT NULL, point INTEGER NOT NULL, PRIMARY KEY(round, player));
INSERT INTO whist VALUES(1, 'Alan', 20);
INSERT INTO whist VALUES(1, 'Benny', 10);
INSERT INTO whist VALUES(1, 'Christian', 40);
INSERT INTO whist VALUES(1, 'Dennis', 30);
INSERT INTO whist VALUES(2, 'Alan', 40);
INSERT INTO whist VALUES(2, 'Benny', 20);
INSERT INTO whist VALUES(2, 'Christian', 30);
INSERT INTO whist VALUES(2, 'Dennis', 10);
INSERT INTO whist VALUES(3, 'Alan', 20);
INSERT INTO whist VALUES(3, 'Benny', 40);
INSERT INTO whist VALUES(3, 'Christian', 10);
INSERT INTO whist VALUES(3, 'Dennis', 30);

*/

function get_connection() {
    $con = new mysqli('localhost', 'root', '', 'Test');
    if(mysqli_connect_errno()) {
        die(mysqli_connect_error());
    }
    return $con;
}

function get_results($sql) {
    $con = get_connection();
    $stmt = $con->prepare($sql) or die(mysqli_error());
    $stmt->execute() or die(mysqli_error());
    $rs = $stmt->get_result();
    $res = array();
    while($row = $rs->fetch_array(MYSQLI_ASSOC)) {
        $res[] = $row;
    }
    $stmt->close();
    $con->close();
    return $res;
}

function display_header($grp, $vals) {
    echo "<table>\r\n";
    echo "<tr>\r\n";
    echo "<th>$grp</th>\r\n";
    echo "<th>$vals</th>\r\n";
    echo "</tr>\r\n";
}

function display_group_item($item) {
    echo "<td>$item</td>\r\n";
}

function display_value_item($item) {
    echo "<td>$item</td>\r\n";
}

function display_footer() {
    echo "</table>\r\n";   
}

function show_horizontal($data, $grpfld, $valfld1, $valfld2) {
    $prev = '';
    $vals = array();
    foreach($data as $res) {
        if($res[$grpfld] != $prev) {
            if(count($vals) > 0) {
                display_value_item(implode(',', $vals));
                $vals = array();
            }
            display_group_item($res[$grpfld]);
            $prev = $res[$grpfld];
        }
        $vals[] = ($res[$valfld1] . ':' . $res[$valfld2]);
    }
    if(count($vals) > 0) {
        display_value_item(implode(',', $vals));
        $vals = array();
    }
}


function show_rounds() {
    $data = get_results('SELECT round, player, point FROM whist ORDER BY round, player');
    display_header('Round', 'Result');
    show_horizontal($data, 'round', 'player', 'point');
    display_footer();
}

function show_players() {
    $data = get_results('SELECT round, player, point FROM whist ORDER BY player, round');
    display_header('Player', 'Result');
    show_horizontal($data, 'player', 'round', 'point');
    display_footer();
}

show_rounds();
show_players();

?>


output:

<table>
<tr>
<th>Round</th>
<th>Result</th>
</tr>
<td>1</td>
<td>Alan:20,Benny:10,Christian:40,Dennis:30</td>
<td>2</td>
<td>Alan:40,Benny:20,Christian:30,Dennis:10</td>
<td>3</td>
<td>Alan:20,Benny:40,Christian:10,Dennis:30</td>
</table>
<table>
<tr>
<th>Player</th>
<th>Result</th>
</tr>
<td>Alan</td>
<td>1:20,2:40,3:20</td>
<td>Benny</td>
<td>1:10,2:20,3:40</td>
<td>Christian</td>
<td>1:40,2:30,3:10</td>
<td>Dennis</td>
<td>1:30,2:10,3:30</td>
</table>
Avatar billede pepsiman Juniormester
28. august 2016 - 21:11 #4
det er fint. jeg kigger på det på tirsdag :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester