laatste 30 dagen mysql query geeft onjuiste resultaat

Overzicht

Sponsored by: Vacatures door Monsterboard

Daniel van Seggelen

Daniel van Seggelen

17/08/2024 10:49:59
Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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?
 
PHP hulp

PHP hulp

13/09/2024 14:04:42
 
Ward van der Put
Moderator

Ward van der Put

17/08/2024 10:56:01
Anchor link
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.
 
Ivo P

Ivo P

17/08/2024 21:30:38
Anchor link
overweeg eens af en toe op enter te drukken.
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)
PHP script in nieuw venster Selecteer het PHP script
1
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;


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)
PHP script in nieuw venster Selecteer het PHP script
1
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;


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.
 
Daniel van Seggelen

Daniel van Seggelen

18/08/2024 08:00:47
Anchor link
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
 
Adoptive Solution

Adoptive Solution

18/08/2024 13:26:06
Anchor link
Zoiets?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
WHERE ( f.einddatum >= now() - INTERVAL 30 day ) and ( f.einddatum <= now() )
 
Ivo P

Ivo P

18/08/2024 15:13:01
Anchor link
en dan nog steeds zonder group-by :-]
 
Jan Koehoorn

Jan Koehoorn

19/08/2024 12:56:14
Anchor link
Of, wat ook zou kunnen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
WHERE f.einddatum BETWEEN DATE_SUB(NOW(), INTERVAL 30 DAY) AND NOW();
Gewijzigd op 19/08/2024 12:57:06 door Jan Koehoorn
 
Ad Fundum

Ad Fundum

25/08/2024 11:26:38
Anchor link
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 datums in de toekomst vallen daaronder, waaronder alle datums uit 2025.
Gewijzigd op 25/08/2024 11:27:12 door Ad Fundum
 
Gabriel Rood

Gabriel Rood

29/08/2024 09:35:52
Anchor link
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
 
Ad Fundum

Ad Fundum

03/09/2024 08:55:07
Anchor link
Daniel van Seggelen op 17/08/2024 10:49:59:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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?

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

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?
Gewijzigd op 03/09/2024 08:58:31 door Ad Fundum
 
Daniel van Seggelen

Daniel van Seggelen

03/09/2024 10:00:16
Anchor link
Mijn oplossing, had mij wel geholpen, want ik krijg hetjuiste resultaat. De folders die nog 30 dagen geldig zijn dus
 
Ad Fundum

Ad Fundum

03/09/2024 11:23:13
Anchor link
Dat kan niet. De probleem query is exact hetzelfde als jouw 'oplossing':

Fout:

Daniel van Seggelen op 17/08/2024 10:49:59:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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?


'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


Snap je waarom wij het niet snappen?
 
Ward van der Put
Moderator

Ward van der Put

03/09/2024 11:56:51
Anchor link
WHERE f.einddatum > now() - INTERVAL 30 day

werd

WHERE f.einddatum < now() + INTERVAL 30 day
 
Daniel van Seggelen

Daniel van Seggelen

03/09/2024 14:59:09
Anchor link
@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.
 
Ward van der Put
Moderator

Ward van der Put

03/09/2024 15:20:50
Anchor link
Dan sluit ik bij deze het topic.
 
 

Dit topic is gesloten.



Overzicht

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.