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
<?
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();
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.
geeft deze query al direct het resultaat dat je nodig hebt?
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.
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.
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
?Onbekende gebruiker
30-04-2020 09:53
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;
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.
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
SUM(IF("sensor1" = `sensor`, `celcius`, 0)) AS temperatuur1