Beste lezers,

Het lijkt een erg eenvoudige query, maar ik kom er niet uit.

Zie hier een voorbeeld inhoud van de tabel "tarief".
Deze tabel is gekoppeld aan de tabel "functie" (functie.functieID = tarief.functieID)
Waarom uurtarief niet gewoon in tabel functie? => Stel dat het uurTarief voor een functie aangepast wordt, moet de historie met het oude tarief natuurlijk nog kloppen.
<?php
functieID | uurTarief | ingangsdatum
1 150.00 23-11-2004
1 155.00 18-05-2005
2 120.00 09-02-2004
1 175.00 19-07-2006
3 120.00 21-10-2006
2 135.00 12-04-2004
?>
Graag wil ik de huidige uurtariefen selecteren, dus wil ik het volgende resultaat:

1 | 175.00 | 19-07-2006
2 | 135.00 | 12-04-2004
3 | 120,00 | 21-10-2006

Simpel gezegt: Ik wil alle uurtariefen met de laatste ingangsdatum

Ik heb verschillende query's geprobeerd, maar kom er niet uit.

Dit werkt bijvoorbeeld niet
SELECT functieID, uurTarief, MAX(ingangsdatum)
FROM tarief
GROUP BY functieID

Nu selecteert hij wel de laatste ingangsdatum, maar toont niet de juiste uurTarief.

Wie kan mij helpen?

Alvast bedankt
Werkt volgens mij het beste door de MAX in een sub-query te bepalen:

[code]
SELECT
a.functieID,
a.uurTarief,
a.ingangsdatum
FROM
tarief a
WHERE
a.ingangsdatum = (SELECT
MAX(b.ingangsdatum)
FROM
tarief b
WHERE
a.functieID = b.functieID)
SELECT 
   a.functieID,
   a.uurTarief,
   a.ingangsdatum,
   MAX(a.ingangsdatum) as nieuwste
FROM 
   tarief a
GROUP BY
   a.functieID
HAVING 
   a.ingangsdatum = nieuwste


En zo?
En pas anders je tabellen even aan:

tabel_functie
id
functie

tabel_tarief
functie_id
uurtarief
datum_ingang
datum_eind

je querie wordt dan

SELECT 
   a.functie_id,
   a.functie,
   b.uurtarief
FROM
  functies a,
  tarief b
WHERE
  a.functie_id=b.functie_id
AND
  b.datum_einde=' '


Volgens mij is dat de beste oplossing



Bedankt voor de reacties.

@Jeroen:
Helaas draait de webserver op SQL 4.0 en niet 4.1, dus kan geen subquery's aanmaken.

@Robert:
Lastig uit te leggen, maar werkt ook niet. De ingangsdatum is niet altijd gelijk aan de "nieuwste", zoals je in de HAVING neerzet. Als er meerdere ingangsdata bestaan voor een functieID, dan pakt hij gewoon de eerste ingangsdatum (want je groepeerd) en hij pakt de MAX ingangsdatum. Dit is dus niet gelijk.
@Jeroen:
Maar je query werkt wel. Dit is precies wat ik wil hebben, maar de server ondersteunt het niet :(. Misschien zal ik het een en ander gaan voorstellen.

@Klaasjan:
Ik begrijp wat je bedoelt, maar toch vind ik de einddatum overbodig. Overbodigheid lijdt dan weer tot inconsistentie. Je zit dan met 2 data te knoeien die goed op elkaar moeten aansluiten.
Ik zal er over nadenken, want het is wel een oplossing.
Even een gokje:

SELECT MAX( ingangsdatum ) AS laatste_wijziging, uurTarief
FROM tarief
GROUP BY uurTarief
Barman schreef op 25.10.2006 12:39
@Jeroen:
.....
@Klaasjan:
Ik begrijp wat je bedoelt, maar toch vind ik de einddatum overbodig. Overbodigheid lijdt dan weer tot inconsistentie. Je zit dan met 2 data te knoeien die goed op elkaar moeten aansluiten.
Ik zal er over nadenken, want het is wel een oplossing.....


Volgens mij is dat juist de manier om historie te bewaren.
Je kunt deze nu altijd beeindigen met UPDATE bla SET datum_einde=NOW())
Barman schreef op 25.10.2006 12:31

@Robert:
Lastig uit te leggen, maar werkt ook niet. De ingangsdatum is niet altijd gelijk aan de "nieuwste", zoals je in de HAVING neerzet. Als er meerdere ingangsdata bestaan voor een functieID, dan pakt hij gewoon de eerste ingangsdatum (want je groepeerd) en hij pakt de MAX ingangsdatum. Dit is dus niet gelijk.


Ik weet niet of je het hebt getest, maar volgens mij pakt die door de group by elke keer de hoogste datum van een bepaald ID..
Als ik het goed heb (zelf niet getest) dan pakt die een id, van die ID de hoogste datum, en dan daarvan de prijs.

Wat je zei over de ingangsdatum gebruik je toch gewoon de MAX ingangsdatum in je echo, tenminste als die wel de juiste gegevens selecteerd.

(nogmaals ik heb het zelf niet getest)
Nogmaals dank.

@Jan:
Getest, maar ik moet niet op uurtarief groeperen, omdat dat juist steeds verschilt. Het moet echt per functie zijn (per functie de huidige tarieven)

@Klaasjan:
Je hebt wel gelijk. Maar ik wil niet graag met periodes werken, tenzij het gaat om aantoonbare start en einddatum (bijv. deadlines bij een project). Op deze manier moeten alle data op elkaar aansluiten, dit vind ik toch iets te riskie.
Toch lijkt mij jouw manier wel het beste en zal ik deze wel gaan toepassen, bedankt.

@Robert:
Ik had het wel getest (dit doe ik altijd).
Jij zegt:
Als ik het goed heb (zelf niet getest) dan pakt die een id, van die ID de hoogste datum, en dan daarvan de prijs.

Nee, dat is het rare. Hij toont (door het groeperen) niet de hoogste prijs bij de MAX datum. Dat is het probleem. Hij toont de eerste tarief dat ie vind, met de MAX ingangsdatum.
@Robert:
Ik weet niet of je het hebt getest, maar volgens mij pakt die door de group by elke keer de hoogste datum van een bepaald ID..
Als ik het goed heb (zelf niet getest) dan pakt die een id, van die ID de hoogste datum, en dan daarvan de prijs.
En dit is een grove fout van MySQL!

Met het gebruik van GROUP BY geef jij aan dat je de eigenschappen van een bepaalde groep records wilt opvragen. De datum die jij echter wilt opvragen, is geen eigenschap van deze hele groep, maar van een individueel record. Dat gaat dus niet lukken, de database hoort daar ook een foutmelding op te geven. Helaas doet MySQL een gok welke gegevens jij vandaag op het scherm wilt zien... Dat kan dus per keer verschillen. Ik weet het niet zeker, maar volgens mij is er een verband met de laatst aangemaakte records, de auto_increment. Het is in elk geval fout en ga hier dus nooit mee werken, het levert uiteindelijk problemen op.

Reageren