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
<?
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.
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?
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.
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.
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
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;
@ 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
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 

doen

Het gaat immers om een temperatuur

Reageren