Ik heb een grote factuurdatabase waarvan ik aan de hand van het aantal verstreken dagen na de uiterste betaaldatum, bepaalde acties wil laten nemen. Ik maak hier het voorbeeld even zo simpel mogelijk:
Tabel met gebruikers
En, niet te vergeten: de tabel met facturen:
De 2e factuur is dus later aan de database toegevoegd. Nu wil ik 1 rij terugkrijgen waarin de userid aan de id van de user tabel is gekoppeld, en alleen de factuur die het meest te laat betaald is word weergegeven. Zo bepaal ik dan een status voor de gebruiker.
Ik ben op de volgende query gekomen:
SELECT
`users`.`id`,
`users`.`email`,
`users`.`payments_ok`,
`invoices`.`mail_not_payed`,
`invoices`.`date_pay_before`
FROM `users` AS `users`
LEFT JOIN `invoices` AS `invoices` ON(`users`.`id`=`invoices`.`userid`)
WHERE
`invoices`.`date_payed`='0' AND
`invoices`.`date_pay_before`<'1156263519'
GROUP BY `users`.`id`
ORDER BY`invoices`.`date_pay_before` ASC
Het probleem zit in de order by: MySQL voert eerst de group by uit, en dan pas de order by. Het gewenste resultaat dat ik wil terugkrijgen is natuurlijk factuurID 2, zodat ik de status "veel_telaat" vind, en vervolgens een handeling kan doen.
Echter, in dit voorbeeld krijg ik factuurID 1 terug! Dat komt simpelweg door de volgorde van de facturen in de database. Als ik factuurid 2 op "weinig_telaat" zet, en "factuurid1 op "veel_telaat" klopt het (doh
).
Ik wil dus voordat group by iets onderneemt, dat eerst alles netjes wordt gesorteerd op "telaat" en daarna een group by, zodat de aller-te-laatste factuur van een gebruiker overblijft.
Hoe kan ik deze query het beste maken? Alvast bedankt weer zoals altijd!
Tabel met gebruikers
| id | payments_ok |
| 10 | 1 |
| 11 | 1 |
En, niet te vergeten: de tabel met facturen:
| id | userid | timestamp |
| 1 | 10 | beetje_telaat |
| 2 | 10 | veel_telaat |
De 2e factuur is dus later aan de database toegevoegd. Nu wil ik 1 rij terugkrijgen waarin de userid aan de id van de user tabel is gekoppeld, en alleen de factuur die het meest te laat betaald is word weergegeven. Zo bepaal ik dan een status voor de gebruiker.
Ik ben op de volgende query gekomen:
SELECT
`users`.`id`,
`users`.`email`,
`users`.`payments_ok`,
`invoices`.`mail_not_payed`,
`invoices`.`date_pay_before`
FROM `users` AS `users`
LEFT JOIN `invoices` AS `invoices` ON(`users`.`id`=`invoices`.`userid`)
WHERE
`invoices`.`date_payed`='0' AND
`invoices`.`date_pay_before`<'1156263519'
GROUP BY `users`.`id`
ORDER BY`invoices`.`date_pay_before` ASC
Het probleem zit in de order by: MySQL voert eerst de group by uit, en dan pas de order by. Het gewenste resultaat dat ik wil terugkrijgen is natuurlijk factuurID 2, zodat ik de status "veel_telaat" vind, en vervolgens een handeling kan doen.
Echter, in dit voorbeeld krijg ik factuurID 1 terug! Dat komt simpelweg door de volgorde van de facturen in de database. Als ik factuurid 2 op "weinig_telaat" zet, en "factuurid1 op "veel_telaat" klopt het (doh
Ik wil dus voordat group by iets onderneemt, dat eerst alles netjes wordt gesorteerd op "telaat" en daarna een group by, zodat de aller-te-laatste factuur van een gebruiker overblijft.
Hoe kan ik deze query het beste maken? Alvast bedankt weer zoals altijd!
Ondernemer in tech (oud LOQED.com, nu UpToMore.com)