[MySQL] FULL JOIN Emuleren

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • insomniac
  • Registratie: Februari 2006
  • Laatst online: 10:07
Ik heb een tabel (fronius) met de waardes uit mijn omvormer.
Deze wordt iedere 5 minuten uitgelezen.

Nu wil ik twee dagen met elkaar vergelijken, echter zijn de dagen natuurlijk niet altijd even lang.
Daarbij weet ik niet van te voren of dag 1 langer is of korter dan dag 2.

ik wil dus een FULL JOIN doen, maar MySQL ondersteund dat niet, het schijnt dat je wel een LEFT JOIN en een RIGHT JOIN samen in een UNION Statement kan stoppen, maar dat gaat mij de pet te boven.

tabel heeft o.a.
id, datetime, power
datetime =YYYY-MM-DD HH:MM:SS

ik heb deze query geprobeerd, maar die werkt dus niet geheel zoals ik wil.
code:
1
2
3
4
5
6
7
8
SELECT t1.tijd, t1.power AS dat1, t2.tijd, t2.power AS dat2
FROM
    (SELECT `power`,DATE_FORMAT(datum,'%H:%i') as tijd FROM `fronius` WHERE DATE_FORMAT(datum,'%Y-%m-%d') = "2020-03-19"
     GROUP BY tijd) As t1
LEFT OUTER JOIN
    (SELECT `power`,DATE_FORMAT(datum,'%H:%i') as tijd FROM `fronius` WHERE DATE_FORMAT(datum,'%Y-%m-%d') = "2019-07-13"
     GROUP BY tijd) As t2
ON t1.tijd = t2.tijd


ik wil dus, als er geen waarde is, een NULL waarde krijgen. Ongeacht of het in de eerste of tweede selectie is.

::. PVOutput: Zuid 4875Wp :: Noord 5406Wp :: Totaal 10281Wp .::

Alle reacties


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Maak een derde tabel met alle tijdstippen, en link daarop. Een alternatief is om de rijen in je applicatie naast elkaar te zetten.

Wat zou 'GROUP BY tijd' moeten doen? Zie ook P&W FAQ - SQL

Let op dat je WHERE-conditie nu niet geïndexeerd kan worden, terwijl dat met een kleine aanpassing van je query wel zou kunnen.

Acties:
  • 0 Henk 'm!

  • Dogooder
  • Registratie: April 2004
  • Laatst online: 14:37

Dogooder

dus...

Ik snap niet precies wat je wil vergelijken, maar de laatste waarde van de dag kan je toch vinden met max('datum')?
En dan een left join op die 2 waardes.

[ Voor 14% gewijzigd door Dogooder op 22-03-2020 13:42 ]


Acties:
  • 0 Henk 'm!

  • insomniac
  • Registratie: Februari 2006
  • Laatst online: 10:07
GlowMouse schreef op zaterdag 21 maart 2020 @ 23:18:
Maak een derde tabel met alle tijdstippen, en link daarop. Een alternatief is om de rijen in je applicatie naast elkaar te zetten.

Wat zou 'GROUP BY tijd' moeten doen? Zie ook P&W FAQ - SQL

Let op dat je WHERE-conditie nu niet geïndexeerd kan worden, terwijl dat met een kleine aanpassing van je query wel zou kunnen.
Bedankt voor je bericht, en je link. Zal deze eens gaan doornemen.
Ik heb het nu in met 2 query's, PHP en Array's in de webpagina, maar wil het graag als 1 query hebben.
De GOUP BY: zonder doet m'n servertje er 5 seconden over om een lijstje te genereren, en met 0,2.
Maar ik heb er te weinig verstand van om te begrijpen waarom. Ik roer professioneel in pannen, en heb geen IT/technische opleiding gevolgd. Ik heb met voorbeelden en trial en error, mezelf wat programmeer kunde aangeleerd.

@Dogooder ik wil zoiets maken:
https://pvoutput.org/comp...2&df=20200321&dt=20200322

::. PVOutput: Zuid 4875Wp :: Noord 5406Wp :: Totaal 10281Wp .::


Acties:
  • 0 Henk 'm!

  • Rotterdammertje
  • Registratie: Juni 2002
  • Laatst online: 28-03-2023
Het eerste Google resultaat op "mysql full outer join" beschrijft hoe je een full outer join kan emuleren: https://stackoverflow.com...-full-outer-join-in-mysql.

code:
1
2
3
4
5
SELECT * FROM t1
LEFT JOIN t2 ON t1.id = t2.id
UNION
SELECT * FROM t1
RIGHT JOIN t2 ON t1.id = t2.id

main = putStr (q ++ show q); q = "main = putStr (q ++ show q); q = "


Acties:
  • 0 Henk 'm!

  • insomniac
  • Registratie: Februari 2006
  • Laatst online: 10:07
@Rotterdammertje Klopt die had ik ook doorgenomen, echter gaat er bij mij iets niet lekker.
ik heb ook dit doorgeneomen: stackoverflow
en dan met name:
code:
1
2
3
4
5
6
7
8
9
10
11
SELECT *
FROM DCHDR AS H
LEFT JOIN DCDTL AS T ON H.DC_No = T.DC_Nos
WHERE H.DC_date BETWEEN '2013-03-02' AND '2013-03-11'
UNION
SELECT *
FROM DCHDR AS H
RIGHT JOIN DCDTL AS T ON H.DC_No = T.DC_Nos
WHERE H.DC_date BETWEEN '2013-03-02' AND '2013-03-11'
ORDER BY `Product_Desc` ASC
LIMIT 510 , 30

als ik:
code:
1
2
3
4
5
6
7
SELECT DATE_FORMAT(fronius.datum,'%H:%i'),fronius.power FROM fronius
LEFT JOIN fronius t2 ON DATE_FORMAT(fronius.datum,'%H:%i') = DATE_FORMAT(t2.datum,'%H:%i')
where DATE_FORMAT(fronius.datum,'%Y-%m-%d') = "2019-07-13" or DATE_FORMAT(t2.datum,'%Y-%m-%d') = "2019-07-14"
UNION
SELECT DATE_FORMAT(fronius.datum,'%H:%i'), fronius.power FROM fronius
RIGHT JOIN fronius t2 ON DATE_FORMAT(fronius.datum,'%H:%i') = DATE_FORMAT(t2.datum,'%H:%i')
where DATE_FORMAT(fronius.datum,'%Y-%m-%d') = "2019-07-13" or DATE_FORMAT(t2.datum,'%Y-%m-%d') = "2019-07-14"

gebruik, blijft PHPMyAdmin op de query hangen. Ergens zit er iets niet goed, en ik weet niet waar ik het moet zoeken.

::. PVOutput: Zuid 4875Wp :: Noord 5406Wp :: Totaal 10281Wp .::

Pagina: 1