laatste 30 dagen mysql query geeft onjuiste resultaat
Code (php)
1
SELECT *, w.naam as winkelnaam from folders f, winkels w WHERE f.einddatum > now() - INTERVAL 30 day AND w.id = f.winkelid group by f.id order by f.einddatum DESC;
Ik krijg gewoon waarden uit 2025, terwijl einddatum een datum veld is.
War is hier fout?
Dat klopt toch gewoon? Je vraagt om een einddatum die groter is dan 30 dagen geleden: alle datums in de toekomst vallen daaronder, waaronder alle datums uit 2025.
Behalve een paar bytes kost dat eigenlijk niets.
En dan ziet je query er zo uit en dat lijkt me een stuk leesbaarder:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
SELECT *, w.naam as winkelnaam
FROM folders f, winkels w
WHERE f.einddatum > now() - INTERVAL 30 day
AND w.id = f.winkelid
-- group by f.id
ORDER BY f.einddatum DESC;
FROM folders f, winkels w
WHERE f.einddatum > now() - INTERVAL 30 day
AND w.id = f.winkelid
-- group by f.id
ORDER BY f.einddatum DESC;
En dan heb ik meteen die group by regel uitgecommenteerd: die hoort daar niet.
En in de vergevingsgezinde modus zal Mysql er iets van proberen te maken.
Vaak zie je dat dat erin gezet wordt op dubbelen te filteren. Maar dan zou je je liever af moeten vragen wat er niet klopt aan de query ipv "doe maar group by erbij"
Zie ook https://www.phphulp.nl/php/tutorial/databases/group-by/846/
Toevoeging op 17/08/2024 21:34:13:
Een wat algemenere syntax zou zijn om een JOIN te gebruiken. (waar jij een join op mysql-wijze gebruikt)
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
SELECT *, w.naam as winkelnaam
FROM folders f, winkels w
JOIN winkels w ON w.id = f.winkelid
WHERE f.einddatum > NOW() - INTERVAL 30 DAY
-- group by f.id
ORDER BY f.einddatum DESC;
FROM folders f, winkels w
JOIN winkels w ON w.id = f.winkelid
WHERE f.einddatum > NOW() - INTERVAL 30 DAY
-- group by f.id
ORDER BY f.einddatum DESC;
En dat geeft mij het idee dat er mogelijk folders zijn die bij meerdere winkels horen?
In dat geval zal group by f.id maar 1x de folder noemen en een willekeurige winkel. Maar welke winkel laat je over aan je database om er 1 te kiezen.
En misschien is dat morgen een andere dan vandaag.
SELECT *, w.naam as winkelnaam from folders f, winkels w
WHERE f.einddatum < now() + INTERVAL 30 day
AND w.id = f.winkelid group by f.id order by f.einddatum DESC;
Wil dus de laatste 30 dagen zien
en dan nog steeds zonder group-by :-]
Gewijzigd op 19/08/2024 12:57:06 door Jan Koehoorn
Ward van der Put op 17/08/2024 10:56:01:
Dat klopt toch gewoon? Je vraagt om een einddatum die groter is dan 30 dagen geleden: alle datums in de toekomst vallen daaronder, waaronder alle datums uit 2025.
Ad Fundum op 25/08/2024 11:26:38:
Toch gek dat de vragensteller over het correcte antwoord heen leest:
Ward van der Put op 17/08/2024 10:56:01:
Dat klopt toch gewoon? Je vraagt om een einddatum die groter is dan 30 dagen geleden: alle hier datums in de toekomst vallen daaronder, waaronder alle datums uit 2025.
Dit is erg belangrijk om te overwegen als u om data vraagt. Veel mensen lijken te vergeten toekomstige datums in de berekening op te nemen.
Gewijzigd op 30/08/2024 07:26:19 door Gabriel Rood
Daniel van Seggelen op 17/08/2024 10:49:59:
Er staan toekomstige datums in de tabel, en die vang je niet af in de query.
Daniel van Seggelen op 18/08/2024 08:00:47:
Ja, dan moet het zo zijn:
SELECT *, w.naam as winkelnaam from folders f, winkels w
WHERE f.einddatum < now() + INTERVAL 30 day
AND w.id = f.winkelid group by f.id order by f.einddatum DESC;
Wil dus de laatste 30 dagen zien
SELECT *, w.naam as winkelnaam from folders f, winkels w
WHERE f.einddatum < now() + INTERVAL 30 day
AND w.id = f.winkelid group by f.id order by f.einddatum DESC;
Wil dus de laatste 30 dagen zien
Dat lukt dus niet met deze query, want je filtert toekomstige datums in de tabel niet hiermee.
En de oplossing hiervoor is gegeven door Adoptive Solution en Jan Koehoorn.
Misschien wil je nog bevestigen of deze oplossing jou ook heeft geholpen?
Mijn oplossing, had mij wel geholpen, want ik krijg hetjuiste resultaat. De folders die nog 30 dagen geldig zijn dus
Fout:
Daniel van Seggelen op 17/08/2024 10:49:59:
'Oplossing':
Daniel van Seggelen op 18/08/2024 08:00:47:
Ja, dan moet het zo zijn:
SELECT *, w.naam as winkelnaam from folders f, winkels w
WHERE f.einddatum < now() + INTERVAL 30 day
AND w.id = f.winkelid group by f.id order by f.einddatum DESC;
Wil dus de laatste 30 dagen zien
SELECT *, w.naam as winkelnaam from folders f, winkels w
WHERE f.einddatum < now() + INTERVAL 30 day
AND w.id = f.winkelid group by f.id order by f.einddatum DESC;
Wil dus de laatste 30 dagen zien
Snap je waarom wij het niet snappen?
werd
WHERE f.einddatum < now() + INTERVAL 30 day
@ward exact - werd + en dat was voor mij de oplossing, dus daarop sluit ik dit topik verder en zal ik daar niet meer op reageren.
Dan sluit ik bij deze het topic.