SELECT laatste uurtarief
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.
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?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
?>
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
Gewijzigd op 01/01/1970 01:00:00 door Barman V
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
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)
a.functieID,
a.uurTarief,
a.ingangsdatum
FROM
tarief a
WHERE
a.ingangsdatum = (SELECT
MAX(b.ingangsdatum)
FROM
tarief b
WHERE
a.functieID = b.functieID)
Gewijzigd op 01/01/1970 01:00:00 door Jeroen Jansen
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
SELECT
a.functieID,
a.uurTarief,
a.ingangsdatum,
MAX(a.ingangsdatum) as nieuwste
FROM
tarief a
GROUP BY
a.functieID
HAVING
a.ingangsdatum = nieuwste
a.functieID,
a.uurTarief,
a.ingangsdatum,
MAX(a.ingangsdatum) as nieuwste
FROM
tarief a
GROUP BY
a.functieID
HAVING
a.ingangsdatum = nieuwste
En zo?
tabel_functie
id
functie
tabel_tarief
functie_id
uurtarief
datum_ingang
datum_eind
je querie wordt dan
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
SELECT
a.functie_id,
a.functie,
b.uurtarief
FROM
functies a,
tarief b
WHERE
a.functie_id=b.functie_id
AND
b.datum_einde=' '
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
@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.
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.
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.....
.....
@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.
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)
@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.
Quote:
En dit is een grove fout van MySQL! 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.
Als ik het goed heb (zelf niet getest) dan pakt die een id, van die ID de hoogste datum, en dan daarvan de prijs.
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.