Avatar billede hrole Mester
29. maj 2019 - 16:16 Der er 5 kommentarer

Array fra mysql

Hej,

Jeg trækker datoer med tilhørende værdi ud via mysqli query og ønsker efterfølgende at vise værdierne for hver dato. Hvordan gør jeg smartes det?

db:
id-date-value
1-2019-09-01-A
2-2019-09-03-A
3-2019-09-04-A
4-2019-09-01-B
5-2019-09-06-B
6-2019-09-09-A
7-2019-09-01-C

Hvis dato=2019-09-01
Vis A B C

Hvis dato=2019-09-06
Vis B
Avatar billede michael_stim Ekspert
29. maj 2019 - 16:21 #1
Hiver dem ud med en GROUP BY i din SQL.
Avatar billede Slater Ekspert
29. maj 2019 - 16:23 #2
Evt

SELECT GROUP_CONCAT(DISTINCT value SEPARATOR ' ') FROM tabelnavn GROUP BY date

hvis det bare skal være simpelt.
Avatar billede hrole Mester
29. maj 2019 - 20:52 #3
Det var måske også en mulighed, men kan jeg trække forskellige grupperinger ud i samme query?

Alså noget ala:
SELECT GROUP_CONCAT(DISTINCT value SEPARATOR ' ') AS V1 FROM tabelnavn GROUP BY date
SELECT GROUP_CONCAT(DISTINCT value SEPARATOR ' ') AS V2 FROM tabelnavn GROUP BY date
SELECT GROUP_CONCAT(DISTINCT value SEPARATOR ' ') AS V3 FROM tabelnavn GROUP BY date
Avatar billede arne_v Ekspert
30. maj 2019 - 02:59 #4
GROUP_CONCAT er nok den nemmeste loesning, men jeg kan ikke lide den loesning.

Jeg synes ikke at en streng er den rigtigte data representation i PHP.

Fremfor:


<?php

class Item {
    public $dt;
    public $vals;
    public function __construct($dt, $vals) {
        $this->dt = $dt;
        $this->vals = $vals;
    }
}

function load() {
    $res = array();
    $con = new mysqli('localhost', 'root', '', 'Test');
    $stmt = $con->prepare("SELECT dt, GROUP_CONCAT(val) AS vals FROM iddtval GROUP BY dt");
    $stmt->execute();
    $rs = $stmt->get_result();
    while($row = $rs->fetch_array(MYSQLI_ASSOC)) {
        $dt = $row['dt'];
        $vals = $row['vals'];
        $res[] = new Item($dt, $vals);
    }
    $stmt->close();
    $con->close();
    return $res;
}

function display($data) {
    foreach($data as $item) {
        $dt = $item->dt;
        $vals = $item->vals;
        echo "$dt $vals\r\n";
    }
}

$data = load();
display($data);
?>


vil jeg foretraekke:


<?php

class Item {
    public $dt;
    public $vals;
    public function __construct($dt) {
        $this->dt = $dt;
        $this->vals = array();
    }
}

function load() {
    $res = array();
    $con = new mysqli('localhost', 'root', '', 'Test');
    $stmt = $con->prepare("SELECT dt, val FROM iddtval ORDER BY dt");
    $stmt->execute();
    $rs = $stmt->get_result();
    $lastdt = 'notexisting';
    while($row = $rs->fetch_array(MYSQLI_ASSOC)) {
        $dt = $row['dt'];
        $val = $row['val'];
        if($dt != $lastdt) {
            $res[] = new Item($dt);
            $lastdt = $dt;
        }
        $res[count($res) - 1]->vals[] = $val;
    }
    $stmt->close();
    $con->close();
    return $res;
}

function display($data) {
    foreach($data as $item) {
        $dt = $item->dt;
        $vals = implode(',', $item->vals);
        echo "$dt $vals\r\n";
    }
}

$data = load();
display($data);
?>
Avatar billede hrole Mester
30. maj 2019 - 12:54 #5
Tak, jeg har nu fået løst mit problem.
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