[SQL] Query laatste prijzen met having

Pagina: 1
Acties:
  • 157 views sinds 30-01-2008
  • Reageer

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 19-11 09:49
Kom even niet uit deze query:

Ik heb 2 tabellen. Eentje met brandstoffen en eentje met prijzen. De prijzen worden nieuwe toegevoegd met huidige datum/tijd bij wijziging, zodat er een geschiedenis opgebouwd wordt.

Nu wil ik een lijstje met brandstoffen en de laatste prijzen, dus ik dacht zoiets:

code:
1
2
3
4
5
SELECT b.naam, p.prijs
FROM brandstoffen AS b 
LEFT JOIN brandstof_prijzen AS p ON b.ID=p.brandstofID 
GROUP BY p.brandstofID 
HAVING datum=MAX(datum)


Dit werkt natuurlijk niet... iemand een idee wat ik met die having kan doen of ik uberhaupt een andere kant op moet denken?

nb: subselects zijn niet mogelijk in de gebruikte MySQL versie.

  • whoami
  • Registratie: December 2000
  • Laatst online: 18:04
Waarom gebruik je een group by en een having als je geen aggregate functie gebruikt ? Op wat wil je dan groeperen ?
Het is gewoon de fout van MySQL dat deze query al werkt....

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 18:04
Kan dit niet gewoon zo ?

code:
1
2
3
4
select b.naam, p.prijs, max(datum)
from brandstoffen
left join brandstof_prijzen .... 
group by b.naam, p.prijs


:?

https://fgheysels.github.io/


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Dan heb je niet de bij de laatste datum behorende prijs toch?

ik zou met een subquery wel iets weten, zonder is wel lastig denk ik zo

Oops! Google Chrome could not find www.rijks%20museum.nl


  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 19-11 09:49
whoami schreef op woensdag 23 februari 2005 @ 17:01:
Kan dit niet gewoon zo ?

code:
1
2
3
4
select b.naam, p.prijs, max(datum)
from brandstoffen
left join brandstof_prijzen .... 
group by b.naam, p.prijs


:?
Dat werkt wel en krijg ik de laatste data, maar niet de prijs die erbij hoort.. waar MySQL die vandaan haalt mag joost weten :P
whoami schreef op woensdag 23 februari 2005 @ 17:00:
Waarom gebruik je een group by en een having als je geen aggregate functie gebruikt ? Op wat wil je dan groeperen ?
Het is gewoon de fout van MySQL dat deze query al werkt....
Klopt.. aangezien ik niet weet welke aggregate functie ik hier toe zou moeten passen B)

  • FendtVario
  • Registratie: Januari 2002
  • Laatst online: 12-05 22:30

FendtVario

The leader drives Vario!

Waarom neem je prijs mee in de group by?

www.fendt.com | Nikon D7100 | PS5


  • Morax
  • Registratie: Mei 2002
  • Laatst online: 12:02
Misschien dat MySQL hem zo pakt? Via de join de gehele geschiedenis koppelen en dan in de join zelf zeggen dat je de laatste datum wilt?

Maar ik zal waarschijnlijk wel ergens een debiele denkfout maken :P

code:
1
2
3
4
SELECT b.naam, p.prijs, max(datum)
FROM brandstoffen AS b
LEFT JOIN brandstof_prijzen AS p ON b.ID=p.brandstofID AND datum = MAX(datum)
GROUP BY b.ID


Edit:
Mja, had ik al verwacht :)

[ Voor 6% gewijzigd door Morax op 23-02-2005 17:21 ]

What do you mean I have no life? I am a gamer, I got millions!


  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 19-11 09:49
Morax schreef op woensdag 23 februari 2005 @ 17:13:
Misschien dat MySQL hem zo pakt? Via de join de gehele geschiedenis koppelen en dan in de join zelf zeggen dat je de laatste datum wilt?

Maar ik zal waarschijnlijk wel ergens een debiele denkfout maken :P

code:
1
2
3
4
SELECT b.naam, p.prijs, max(datum)
FROM brandstoffen AS b
LEFT JOIN brandstof_prijzen AS p ON b.ID=p.brandstofID AND datum = MAX(datum)
GROUP BY b.ID
MySQL vind je suggestie een wat minder goed idee :P

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

@FendtVario en Morax: P&W FAQ - Hoe werkt dat GROUP BY nou eigenlijk?
Bosmonster schreef op woensdag 23 februari 2005 @ 17:16:
MySQL vind je suggestie een wat minder goed idee :P
Het probleem is juist dat MySQL dat prima vindt, terwijl hij erop zou moeten vastlopen. :P

[ Voor 49% gewijzigd door NMe op 23-02-2005 17:20 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 19-11 09:49
-NMe- schreef op woensdag 23 februari 2005 @ 17:19:
@FendtVario en Morax: P&W FAQ - Hoe werkt dat GROUP BY nou eigenlijk?


[...]

Het probleem is juist dat MySQL dat prima vindt, terwijl hij erop zou moeten vastlopen. :P
Dat komt er op neer dat dit niet mogelijk is dus? Want ik heb de prijs nodig, maar kan er niet op groupen..

code:
1
2
3
4
5
SELECT b.naam, p.prijs, MAX( p.datum ) 
FROM brandstoffen AS b
LEFT JOIN brandstof_prijzen AS p ON b.ID = p.brandstofID
GROUP BY p.brandstofID, p.prijs
ORDER BY b.volgnr

[ Voor 22% gewijzigd door Bosmonster op 23-02-2005 17:24 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 18:04
Ik denk dat je 2x zult moeten joinen op de prijzen tabel

code:
1
2
3
4
5
6
select b.naam, max(p.datum), p2.prijs
from brandstof
left join prijzen as p on b.id = p.brandstof_id
left join prijzen as p2 on p.id = p2.id
....
group by b.naam, p2.prijs

:X
niet getest ofzo...

https://fgheysels.github.io/


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Bosmonster schreef op woensdag 23 februari 2005 @ 17:23:
Dat komt er op neer dat dit niet mogelijk is dus? Want ik heb de prijs nodig, maar kan er niet op groupen..
Het zal vast wel mogelijk zijn, maar niet op de manier in de query die je in deze post maakte. Die van whoami komt waarschijnlijk meer in de buurt. :)
code:
1
2
3
4
5
SELECT b.naam, p.prijs, MAX( p.datum ) 
FROM brandstoffen AS b
LEFT JOIN brandstof_prijzen AS p ON b.ID = p.brandstofID
GROUP BY p.brandstofID, p.prijs
ORDER BY b.volgnr
* NMe wijst Bosmonster op subtiele wijze op de FAQ die hij net noemde. Je moet altijd groeperen op elk veld dat je selecteert, en dat geen aggregate function is. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Bosmonster schreef op woensdag 23 februari 2005 @ 16:50:

code:
1
2
3
4
SELECT b.naam, p.prijs
FROM brandstoffen AS b 
LEFT JOIN brandstof_prijzen AS p ON b.ID=p.brandstofID AS x
WHERE datum IN (SELECT MAX x.datum FROM x GROUP BY x.ID)
Deze dan?

[ Voor 4% gewijzigd door Verwijderd op 23-02-2005 17:29 ]


  • Morax
  • Registratie: Mei 2002
  • Laatst online: 12:02
Uit de topicstart:
nb: subselects zijn niet mogelijk in de gebruikte MySQL versie.

What do you mean I have no life? I am a gamer, I got millions!


  • FendtVario
  • Registratie: Januari 2002
  • Laatst online: 12-05 22:30

FendtVario

The leader drives Vario!

@NME, dank voor de subtiele verwijzing, ik was ff aan het proberen maar had een kolom over het hoofd gezien waar toch nog iets verkeerds in stond.

www.fendt.com | Nikon D7100 | PS5


  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 19-11 09:49
hmm ja.. dan zou ik dus moeten groupen op naam.. kweet niet of dat de resultaten ten goede gaat komen :P

  • Morrar
  • Registratie: Juni 2002
  • Laatst online: 09:55
Heb er nu een tijdje aan zitten frummelen, maar volgens mij is dit niet mogelijk idd. Je kan nog joinen en dan laten sorteren (heb je de max datum iig bovenaan) maar je kan niet alleen de rij met de maximale datum eruit peuteren (erna een group by doen werk iig niet). Een stored procedure of subselect zou uitkomst bieden, maar ja dat gaat met je MySQL dus niet lukken.

//Edit: laat maar kolomnamen niet gelijk 8)7

[ Voor 30% gewijzigd door Morrar op 23-02-2005 17:41 ]


Verwijderd

Dat had ik even over het hoofdgezien... :X

Ik vrees dat het met 1 query niet mogelijk is. Wat je dan kunt doen is 2 aparte queries uitvoeren en de resultaten dan aan elkaar knopen in PHP ofzo.

Ik neem aan dat deze versie van MySQL dan ook geen views ondersteund, anders zou je van de subquery nog een view kunnen maken, maar dat is eigenlijk hetzelfde principe natuurlijk.

Anders zou ik het ook niet weten, behalve dan een nieuwere MySQL installeren, mocht je die mogelijkheid hebben natuurlijk :)

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 19-11 09:49
Helaas niet :) Ik ga er 2 query's van maken.

Verwijderd

Bosmonster schreef op woensdag 23 februari 2005 @ 17:48:
Helaas niet :) Ik ga er 2 query's van maken.
Doe dat :)

Wel ondersteunen van views had trouwens heel vreemd geweest, omdat een view niet fysiek wordt bewaard maar eigenlijk niks meer is dan een query die bij aanspreken van de view wordt uitgevoerd et voila: een subquery :P

  • thomaske
  • Registratie: Juni 2000
  • Laatst online: 27-11 21:33

thomaske

» » » » » »

Was net met hetzelfde probleem aan het stoeien en het is m.i. opgelost met een dubbele join:
- eentje om de max te bepalen van de ge-joinde tabel
- eentje om de waarden van de tabel te achterhalen
met de having clause zorg je ervoor dat de max van join1 gelijk is aan de datum van join2:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT 
    b.naam
,   p.prijs
,   p.datum
,   max(p2.datum) AS max_datum
FROM 
    brandstoffen AS b 
LEFT JOIN 
    brandstof_prijzen AS p ON b.ID = p.brandstofID 
LEFT JOIN 
    brandstof_prijzen AS p2 ON b.ID = p.brandstofID 
GROUP BY 
    p.brandstofID 
HAVING 
    (max_datum = p.datum)

weet niet zeker of dit in jouw situatie exact zo werkt, maar het idee blijft hetzelfde

Brusselmans: "Continuïteit bestaat niet, tenzij in zinloze vorm. Iets wat continu is, is obsessief, dus ziekelijk, dus oninteressant, dus zinloos."

Pagina: 1