Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[SQL] query word niet goed uitgevoerd.

Pagina: 1
Acties:

  • The-Source
  • Registratie: Augustus 2001
  • Laatst online: 09:00
Ik heb ondertussen de volgende query (welke niet goed werkt)
SQL:
1
2
3
4
SELECT TIME_FORMAT(vocht.Tijd,'%H:%i') AS Uren, temperatuur.Buitentemp, vocht.Buitenvocht, vocht.WKvocht, vocht.SLPKMRvocht, vocht.BADKMRvocht 
FROM `temperatuur`, `vocht` 
JOIN vocht Datum ON vocht.Datum=temperatuur.Datum 
WHERE vocht.Datum = curdate() order by `Uren`

De 2 tabellen hebben de volgende structuur: Datum(date), Tijd(time) en daarna de kolommen met boven genoemde namen (decimal 3,1)
Velden Datum en Tijd komen in beide tabellen voor en worden ook identiek aan elkaar weg geschreven.
Beide tabellen worden elk kwartier van nieuwe data voorzien en krijgen daarbij dezelfde timestamp. Ik heb er ook bewust voor gekozen om dit in 2 tabellen te zetten en ook datum en tijd te scheiden.

Probleem met de query is dat deze in de bovenstaande vorm 40 seconde uitvoer tijd heeft en ook alles behalve de juiste data terug geeft. Miljoenen regels resultaten ipv een regel of 70 :P (query duurt ook 40 seconden :P )
Als ik de query uitvoer zonder JOIN krijg ik nog steeds 53k resultaten :?

En de volgende query (over 1 tabel) gaat wel helemaal naar wens dus je zou denken zo moeilijk hoeft het niet te wezen
SQL:
1
2
SELECT TIME_FORMAT(Tijd,'%H:%i') AS Uren, `Buitentemp`,`WKtemp`, `SLPKMRtemp`, `BADKMRtemp`, `Zoldertemp`, `WCtemp` 
FROM `temperatuur` WHERE  `Datum` = curdate() order by 'Uren'

Blijkbaar zie ik dus iets over het hoofd waarom het niet goed gaat.

Taal fouten inbegrepen ;)
Mijn AI Art YouTube kanaal


  • thof
  • Registratie: Oktober 2008
  • Laatst online: 21-11 18:21

thof

FP ProMod
Waarom selecteer je informatie uit twee tabellen (temperatuur en vocht) en doe je er ook nog eens een join met die laatste tabel (vocht)?

Edit, probeer dit eens:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
SELECT 
    TIME_FORMAT(v.Tijd,'%H:%i') AS Uren, 
    t.Buitentemp, 
    v.Buitenvocht, 
    v.WKvocht, 
    v.SLPKMRvocht, 
    v.BADKMRvocht  
FROM temperatuur AS t
    JOIN vocht AS v
        ON v.Datum = t.Datum  
WHERE v.Datum = curdate() 
ORDER BY Uren ASC


Wellicht wil je ook nog joinen met de tijd omdat je anders erg veel resultaten gaat krijgen op datum. Je zou ook kunnen overwegen om de twee kolommen samen te voegen en een datetime type te gebruiken.

[ Voor 73% gewijzigd door thof op 04-05-2014 16:20 . Reden: Code sample ]

Server 1: Intel N305 | 48GB RAM | 5*4TB NVME | 4x 2.5GbE
Server 2: Intel N5105 | 64GB RAM | 1TB NVME | 4x 2.5GbE
Server 3: Intel Xeon E5-2670 | 128GB RAM | 512+750GB SATA SSD | 6x10TB HDD | 6x 1GbE [Buiten gebruik]


  • The-Source
  • Registratie: Augustus 2001
  • Laatst online: 09:00
Nou die JOIN heb ik later pas geprobeerd omdat ik het dus al niet werkend kreeg omdat ik een Datum = ambigious melding kreeg.

Taal fouten inbegrepen ;)
Mijn AI Art YouTube kanaal


  • The-Source
  • Registratie: Augustus 2001
  • Laatst online: 09:00
Dit geeft 193 pagina's a 30 records. Ziet er in het resultaat uit dat hij voor elke buitentemperatuur uit de temperatuur tabel hij een record maakt met alle tijdstippen die er in de vocht tabel staan.
code:
1
2
3
4
5
6
7
8
9
Uren Buitentemp Buitenvocht WKvocht SLPKMRvocht BADKMRvocht
15:30   7.6 41.0    52.0    57.0    45.0
15:30   7.5 41.0    52.0    57.0    45.0
15:30   7.5 41.0    52.0    57.0    45.0
15:30   7.3 41.0    52.0    57.0    45.0
15:30   7.1 41.0    52.0    57.0    45.0
15:30   7.0 41.0    52.0    57.0    45.0
15:30   6.9 41.0    52.0    57.0    45.0
15:30   6.7 41.0    52.0    57.0    45.0

Dit is dus een stukje van de output

Taal fouten inbegrepen ;)
Mijn AI Art YouTube kanaal


  • thof
  • Registratie: Oktober 2008
  • Laatst online: 21-11 18:21

thof

FP ProMod
Probeer dan deze eens, mocht dat ook niet werken dan graag even een klein datasetje maken zodat we zelf even met data kunnen werken dan maar wat queries roepen :-)

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
SELECT  
    TIME_FORMAT(v.Tijd,'%H:%i') AS Uren,  
    t.Buitentemp,  
    v.Buitenvocht,  
    v.WKvocht,  
    v.SLPKMRvocht,  
    v.BADKMRvocht   
FROM temperatuur AS t 
    JOIN vocht AS v 
        ON v.Datum = t.Datum   AND v.Tijd = t.Tijd
WHERE v.Datum = curdate()  
ORDER BY Uren ASC


Wat is er anders? de tijd wordt nu ook mee genomen in de join.
Velden Datum en Tijd komen in beide tabellen voor en worden ook identiek aan elkaar weg geschreven.
Beide tabellen worden elk kwartier van nieuwe data voorzien en krijgen daarbij dezelfde timestamp. Ik heb er ook bewust voor gekozen om dit in 2 tabellen te zetten en ook datum en tijd te scheiden.
Als er toch altijd gejoined wordt met exact dezelfde data zou ik het lekker in één tabel houden, maakt het uitvragen van de tabellen een stuk sneller en minder complex. Net zoals het gebruik van een apart datum en tijd veld, als je ze toch beide nodig hebt gebruik dan lekker datetime. Ook op een datetime kun je ranges uitvragen namelijk. Ben dus wel benieuwd naar de motivatie hier achter.

Server 1: Intel N305 | 48GB RAM | 5*4TB NVME | 4x 2.5GbE
Server 2: Intel N5105 | 64GB RAM | 1TB NVME | 4x 2.5GbE
Server 3: Intel Xeon E5-2670 | 128GB RAM | 512+750GB SATA SSD | 6x10TB HDD | 6x 1GbE [Buiten gebruik]


  • The-Source
  • Registratie: Augustus 2001
  • Laatst online: 09:00
Die query werkt _/-\o_

Nou de reden dat ik het gesplitst hebt is als volgt.
Normaal gesproken laat ik dus alleen een grafiek zien van de temperatuur sensoren (waaronder buitentemp)
Nu worden temperatuur en vocht allemaal tegelijk geupdate zonder voorwaarden of er iets is veranderd.
Dit gaat later dus nog wel gebeuren.
De koppeling is nu ik de vocht sensoren ook wil gaan gebruiken erbij gekomen. En ja het kan in 1 tabel maar als straks de update frequentie word terug gebracht is het scheiden ervan beter in data verbruik. % vocht wisselt minder sterk dan de temperatuur. En temperatuur word nu 5x per uur gecontroleerd terwijl vocht 2x per uur meer dan voldoende is.
De reden van datum en tijd splitsen is eigenlijk dat er bijna elke request van de data (nu nog puur door mij zelf) alleen van de huidige dag is. Zonder het te testen lijkt mij dat sneller dan een query die de dag uit een DATETIME haalt.
Daarnaast zit er ik nog aan te denken om op een later moment een gemiddelde per dag uit te rekenen en weg te schrijven maar dat plannetje zit nu nog alleen in mijn hoofd en heb ik nog niet uit gewerkt.
Database kan altijd nog wel aangepast worden maar ik zie daar nu nog geen reden voor.

Taal fouten inbegrepen ;)
Mijn AI Art YouTube kanaal


  • incaz
  • Registratie: Augustus 2012
  • Laatst online: 15-11-2022
Wat betreft je eerste query: dat gaat fout omdat je meerdere records hebt met dezelfde datum. Als je elk kwartier een nieuw record krijgt, krijg je dus in een uur al 4 temperatuur-records en 4 vocht-records, en die probeert sql dan te combineren. Dus temp1-vocht1 maar ook temp1-vocht2 en temp2-vocht1, temp2-vocht2 etc. In totaal bestaat je resultaat dan dus al uit 4 x 4 = 16 records, en veel meer rekentijd.

Zorg dus dat de join-voorwaarde aan beide kanten maar 1 record oplevert, zodat je precies weet wat je aan elkaar moet koppelen. Vermoedelijk maakt dat het ook erg lastig om om te gaan met 2 verschillende updatefrequenties die je toch aan elkaar wilt koppelen. (Als je het in een tabel wilt weergeven, bedenk dan bv precies hoe die eruit moet zien als je de ene elke 12 minuten en de andere elke 30 minuten update: hoe zien de regels eruit?)
En als je grafiekjes in een graph gaat plotten ben je vermoedelijk beter af om de datasets gewoon apart te queryen en in de grafiek pas samen te voegen.

Never explain with stupidity where malice is a better explanation

Pagina: 1