msql tabel uitlezen en sorteren in tabel
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)
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
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;
}
}
?>
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
Kijk eens naar de modulo-operator om te kijken of het het aantal door drie kan delen.
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?
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
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
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
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.
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.
thx voor de tips ga is kijken wat ik hier mee kan
-- 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;
@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
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)
1
2
3
4
5
6
7
8
9
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;
`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
doen
Het gaat immers om een temperatuur