msql tabel uitlezen en sorteren in tabel

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

P koppert

p koppert

29/04/2020 13:39:35
Quote Anchor link
Goedendag,

ik heb de volgende tabel in mysql

datum , sensor, temperatuur
is zo gevuld

datum sensor1 21
datum sensor2 21
datum sensor3 41
datum sensor1 22
datum sensor2 22
datum sensor3 42
datum sensor1 24
datum sensor2 24
datum sensor3 44

dit wil ik de volgende manier in een tabel hebben

datum sensor1 sensor2 sensor3
datum 21 21 41
datum 22 22 42
datum 24 24 44

gebruik de volgende query om gegevens op te halen
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?
try {
    $db = DB();
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $smst = "SELECT `event`, `sensor`, `celcius` FROM `tempratuuropslag` ORDER BY `event` DESC LIMIT 480";
    $results = $db->query($smst);
    $results->execute();

    if ($results->rowCount() >0 )
    {
    echo "<table border='0' cellspacing='0' cellpadding='4' color='#666'>
                        <tr>
                        <th>id</th>
            <th>tijd</th>
                        <th>celcius</th>
                        </tr>"
;

        while($rows = $results->fetch(PDO::FETCH_ASSOC))
        {

            $vf_idd = $rows['id'];
        $relatie_id = $rows['event'];
            $project = $rows['sensor'];
            $nr_klant = $rows['celcius'];

           echo "<tr>";
            echo"<td>".$vf_idd."</td>";
            echo"<td>".$relatie_id."</td>";
            echo"<td>".$project."</td>";
            echo"<td>".$nr_klant."</td>";
          echo "<tr/>";
        }


        echo "u bent in gelogt<br>";
    }
else {
        echo "sorry niks gevonden";
        return false;
    }
}

?>


hoe moet ik de huidige tabel aanpassen om de juiste layout te krijgen
 
PHP hulp

PHP hulp

25/04/2024 14:29:13
 
- Ariën  -
Beheerder

- Ariën -

29/04/2020 13:42:05
Quote Anchor link
Kijk eens naar de modulo-operator om te kijken of het het aantal door drie kan delen.
 
Ivo P

Ivo P

29/04/2020 14:32:46
Quote Anchor link
Het lijkt me verstandig om na de datum ook te sorteren op Sensor.

Nu kun je de eerste 3 records zo maar binnen krijgen als
2020-04-29 metingsensor1
2020-04-29 metingsensor2
2020-04-29 metingsensor3

maar op gisteren als
2020-04-29 metingsensor1
2020-04-29 metingsensor3
2020-04-29 metingsensor2


En wat trouwens als je voor sensor3 geen meting hebt op 25 april?
 
Thomas van den Heuvel

Thomas van den Heuvel

29/04/2020 14:37:54
Quote Anchor link
Voordat je de tabel gaat opbouwen moet je weten hoeveel sensors je hebt.
Vervolgens kun je dan je table header opbouwen met die info.

Mogelijk zou je een CROSS JOIN kunnen gebruiken om de informatie in je query zo te ordenen dat elk resultaatrecord overeenkomt met een tabelrij, zodat je dit 1 op 1 kunt uitlezen en dan de informatie uit kunt draaien.

Maar wat je ook kunt doen is dit deelprobleem deels delegeren naar PHP, je zou hier een hulparray (datastructuur) voor kunnen bouwen die sensordata per datum groepeert. Vervolgens loop je door dit array heen.

EDIT: wat @Ivo zegt klopt ook, hoe meer je de informatie vantevoren ordent, hoe minder werk je hier vervolgens aan hebt. En er werd tot nu toe inderdaad stilzwijgend aangenomen dat alle sensors altijd metingen hebben op alle datums, indien dit niet het geval is dan zul je hier in moeten voorzien.
Gewijzigd op 29/04/2020 14:39:38 door Thomas van den Heuvel
 
Ivo P

Ivo P

29/04/2020 14:57:32
Quote Anchor link
geeft deze query al direct het resultaat dat je nodig hebt?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
SELECT DISTINCT
        A.datum,
        meting1.celcius AS meetwaarde1,
        meting2.celcius AS meetwaarde2,
        meting3.celcius AS meetwaarde3
    
FROM tempratuuropslag A
LEFT JOIN tempratuuropslag meting1 ON A.datum = meting1.datum AND sensor = 1
LEFT JOIN tempratuuropslag meting2 ON A.datum = meting2.datum AND sensor = 2
LEFT JOIN tempratuuropslag meting3 ON A.datum = meting3.datum AND sensor = 3

ORDER BY A.datum DESC


Ik ben niet dol op query's waarin DISTINCT staat, maar anders krijg je elke rij tot maximaal 3 keer te zien.

Verder is dit niet heel dynamisch: als je een 4e sensor toevoegt, moet je je query's weer herbouwen.
 
Thomas van den Heuvel

Thomas van den Heuvel

29/04/2020 15:25:10
Quote Anchor link
Ivo P op 29/04/2020 14:57:32:
Verder is dit niet heel dynamisch: als je een 4e sensor toevoegt, moet je je query's weer herbouwen.

Wat dat betreft valt er iets voor te zeggen om de informatie zo "neutraal" mogelijk aan te leveren, zonder al teveel aannames over hoe deze informatie vervolgens gebruikt gaat worden (en dat is wellicht ook aan verandering onderhevig).

Maar goed als je de query niet herbouwt zul je wat extra moeten programmeren, het werk moet ergens verzet worden.

En als er in de toekomst mogelijk sensoren bijkomen schrijf je de query en de code liefst zodanig dat je hier niets aan hoeft te veranderen maar dat dit meteen werkt.
 
P koppert

p koppert

29/04/2020 16:56:57
Quote Anchor link
eerlijk bekennen php mysql is niet mijn dagelijks activiteit en een tijd geleden dat ik er wat mee heb gedaan
thx voor de tips ga is kijken wat ik hier mee kan
 
Ad Fundum

Ad Fundum

30/04/2020 09:53:01
Quote Anchor link
Het ligt voor de hand om het herschikken van gegevens in de database te doen:

-- testtabel aanmaken
CREATE TABLE `temperatuuropslag` AS
SELECT CURRENT_DATE AS `event`, "sensor1" AS `sensor`, 21 AS `celcius`
UNION SELECT CURRENT_DATE, "sensor2", 21
UNION SELECT CURRENT_DATE, 'sensor3', 41
UNION SELECT DATE(CURRENT_DATE - 1), 'sensor1', 22
UNION SELECT DATE(CURRENT_DATE - 1), 'sensor2', 22
UNION SELECT DATE(CURRENT_DATE - 1), 'sensor3', 42
UNION SELECT DATE(CURRENT_DATE - 2), 'sensor1', 24
UNION SELECT DATE(CURRENT_DATE - 2), 'sensor2', 24
UNION SELECT DATE(CURRENT_DATE - 2), 'sensor3', 44;

-- gegevens draaien
SELECT `event`,
SUM(IF("sensor1" = `sensor`, `celcius`, 0)) AS "sensor1",
SUM(IF("sensor2" = `sensor`, `celcius`, 0)) AS "sensor2",
SUM(IF("sensor3" = `sensor`, `celcius`, 0)) AS "sensor3"
FROM `temperatuuropslag`
GROUP BY `event`
ORDER BY `event` DESC
LIMIT 480;
 
P koppert

p koppert

04/05/2020 19:38:50
Quote Anchor link
@ Ad dit is niet wat ik zoek huidige mysql tabel wordt blijft automatisch gevuld worden dan zou ik iedere keer een een nieuwe tabel moeten maken

@ivo en Thomas jullie planten bomen en zie nu door de bomen het bos niet meer.

is het zo moeilijk om uit een mysql tabel met 4 kollommen(id, datumtijd, sensornr, graden)

een html tabel te krijgen met 4 kolommen (datumtijd, graden sensor1, graden sensor2, graden sensor 3, graden sensor4)

zeker als er bij een tijd een van de sensors geen graden heeft zal deze gewoon blank(leeg) geprint moeten worden.

cross of left joins gebruik je toch alleen maar als je dubbele mysql tabellen hebt die aan elkaar gelinkt zijn
 
Ivo P

Ivo P

04/05/2020 19:55:33
Quote Anchor link
Je snapt de query van Ad niet: dat bovenste stuk is alleen maar een stukje om een voorbeeldtabel te vullen. Iets dat jij al gedaan hebt, want jij hebt de data al.

Het gaat om het tweede stuk.

Ik moest ook 2x kijken wat de query doet. Dat is globaal hetzelfde als mijn query, maar dan zonder de benodigde distinct.

Doordat hij SUM() gebruikt, zorgt de bijbehorende GROUP BY event, dat je geen dubbele records krijgt en DISTINCT dus niet nodig is.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
SELECT
   `event`,    
   SUM(IF("sensor1" = `sensor`, `celcius`, 0)) AS "sensor1",
   SUM(IF("sensor2" = `sensor`, `celcius`, 0)) AS "sensor2",
   SUM(IF("sensor3" = `sensor`, `celcius`, 0)) AS "sensor3"
FROM `temperatuuropslag`
GROUP BY `event`
ORDER BY `event` DESC
LIMIT 480;


regel 2 spreekt voor zich: de datum
regel 3: ALS/ IF de kolom "sensor" de waarde "sensor1" bevat, dan pak je de bijbehorende temperatuur. Anders 0.
Dat sommeer je voor alle rijen. Maar er zal er hooguit 1 zijn voor die datum. Dus dat is precies de bedoelde temperatuur.

Dat gaat dan voor elke sensor op. Dus 3x.
Group by is een verplichte regel om dit per datum te doen.

Is zou alleen
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
   SUM(IF("sensor1" = `sensor`, `celcius`, 0)) AS temperatuur1

doen

Het gaat immers om een temperatuur
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.