PHP SQL ORDER VS GROUP

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Jolly Janssen

Jolly Janssen

01/02/2023 09:53:44
Quote Anchor link
Hallo Allemaal,

Ik loop tegen een probleem aan en weet niet hoe ik dit moet oplossen.

select * from beoordeling WHERE groep = '16' GROUP BY id_talent ORDER BY datum

Hij laat nu 1 beoordeling zien van elk talent, dat is opzicht goed. Alleen de ORDER BY doet hij nu naar de GROUP waardoor ik niet de laaste datum krijg. DESC er achter zetten helpt ook niet.

Ik weet dus niet hoe ik er voor kan zorgen dat hij de laaste datum pakt van de beoordeling
 
PHP hulp

PHP hulp

23/11/2024 19:28:35
 
- Ariën  -
Beheerder

- Ariën -

01/02/2023 10:21:47
Quote Anchor link
Wat voor type is je datum veld?
 
Jolly Janssen

Jolly Janssen

01/02/2023 10:25:04
Quote Anchor link
type is: date
 
- Ariën  -
Beheerder

- Ariën -

01/02/2023 10:30:05
Quote Anchor link
SELECT * FROM beoordeling WHERE groep = '16' GROUP BY id_talent ORDER BY datum DESC

Zou volgens mij moeten werken.

Anders kijk ik even. Heb je een structuurdumpje dan?
 
Jolly Janssen

Jolly Janssen

01/02/2023 10:54:30
Quote Anchor link
Nee dit doet niet wat het zou moeten doen;

Afbeelding
Afbeelding
 
- Ariën  -
Beheerder

- Ariën -

01/02/2023 10:55:42
Quote Anchor link
Kan je de structuurdump hier plaatsen, zodat ik die in kan laden?

Toevoeging op 01/02/2023 10:58:04:

Lol, de data zijn toch aflopend?
 
Jolly Janssen

Jolly Janssen

01/02/2023 11:06:10
Quote Anchor link
Ik moet de laatste datum hebben dus 2023-02-01 en wat ik ook doe krijg ik altijd 2023-01-31
 
- Ariën  -
Beheerder

- Ariën -

01/02/2023 11:09:03
Quote Anchor link
De query werkt prima als je het aflopend selecteert. Als je oplopend wilt selecteren gebruik je ASC.

Of je past de datum toe in WHERE als je enkel die records wilt hebben.
Gewijzigd op 01/02/2023 11:10:16 door - Ariën -
 
Ivo P

Ivo P

01/02/2023 11:18:28
Quote Anchor link
Die group by heeft niets te zoeken in een query zonder aggregatie functie (zoals MAX(), MIN() Count() of SUM() )

https://www.phphulp.nl/php/tutorial/databases/group-by/846/group-by-hoe-werkt-het/2376/


Toevoeging op 01/02/2023 11:19:52:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
SELECT datum
FROM beoordeling
WHERE groep = 16
ORDER BY datum DESC
LIMIT 1
 
Jolly Janssen

Jolly Janssen

01/02/2023 11:31:40
Quote Anchor link
Als ik SELECT * FROM beoordeling WHERE groep = '16' GROUP BY id_talent ORDER BY datum ASC uitvoer komt 1 regel naar voor met de datum 2023-01-31

Als ik SELECT * FROM beoordeling WHERE groep = '16' GROUP BY id_talent ORDER BY datum DESC uitvoer komt 1 regel naar voor met de datum 2023-01-31

Er blijft maar een verkeerde datum uitkomen.

@Ivo P, die GROUP BY is nodig om te zorgen dat er geen dubbele uitkomsten uit komen van het zelfde talent.
 
Ivo P

Ivo P

01/02/2023 11:40:31
Quote Anchor link
Nee, dat is een onhandige feature in MySQL om te raden wat je ongeveer zal hebben bedoeld. Zie het voorbeeld dat in dat linkje te vinden is over automerken en -typen.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
SELECT talent_id, MAX(datum) AS laatstedatum
FROM beoordeling
WHERE groep = 16
GROUP BY talent_id


En als je nog meer velden dan talent_id wilt zien, moet je die zowel achter SELECT als achter GROUPBY plaatsen
 
- Ariën  -
Beheerder

- Ariën -

01/02/2023 11:41:08
Quote Anchor link
Net in je visuele voorbeeld ging het goed met dezelfde query. Hij sorteerde aflopend.
 
Ivo P

Ivo P

01/02/2023 11:52:37
Quote Anchor link
al geeft een query het gevraagde resultaat, dan nog moet je niet group-by gebruiken icm. SELECT*.

Hij pakt in die foute query een "groupering" op talent_id. Daarbij pakt hij een willekeurige rij. Die ene rij wordt gesorteerd (wat netto geen effect heeft).
Toevallig is dat nu niet het resultaat dat Jolly zoekt.
Was dat wel het geval geweest, dan was de query goed bevonden, en zit je over 3 maanden je af te vragen waarom er soms een verkeerde datum genoemd wordt.

Je moet eigenlijk zorgen dat Mysql alleen goede query's uitvoert:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
SET sql_mode = 'ONLY_FULL_GROUP_BY';
 
Jolly Janssen

Jolly Janssen

01/02/2023 12:02:56
Quote Anchor link
Hallo Ivo,

Owke... ja zoals je het gezegd zo gebeurd het ook.
Hoe zou de code er dan moeten uit zien?

Waar plaats ik die SET?
 
Ivo P

Ivo P

01/02/2023 12:05:08
Quote Anchor link
die set query zou je in phpmyadmin een keer uit kunnen voeren.
In elk geval in die sessie zou dat bewaard moeten blijven en mag je een incomplete group-by query's uitvoeren.

Kun je wat met de query in de post van 11:40 ?
 
Jolly Janssen

Jolly Janssen

01/02/2023 12:08:28
Quote Anchor link
Yes, dit werkt.
Ik ben jullie dankbaar voor de hulp.

Toevoeging op 01/02/2023 12:16:21:

We zijn er toch nog niet helemaal haha.

Ik heb ook nog een cel performance en potentie.
Deze zijn gevuld bij de datum 01-02-2023 met het nummer 2 en 2
en bij de datum 31-01-2023 met het nummer 1 en 1

Deze nummers kunnen natuurlijk veranderen maar dit is zoals er er nu in staan.
Ook te zien in de afbeelding hier boven.

Ik voer nu uit;

SELECT id_talent, MAX(datum) AS laatstedatum, performance as performance, potentie as potentie FROM beoordeling WHERE groep = '16' GROUP BY id_talent

Dan krijg ik bij laastedatum te zien 2023-02-01 en bij performance en potentie het getal 1 en 1
Als ik in de datbase kijk zou dit dus getal 2 en 2 moete zijn.

Toevoeging op 01/02/2023 12:46:17:

Ik krijg niet de cellen er uit zeg maar die bij de rij hoort van de datum
 
Ivo P

Ivo P

01/02/2023 12:59:52
Quote Anchor link
Zoals gezegd: wat je aan gewone kolommen toevoegt bij SELECT _moet_ ook komen bij GROUP BY
 
Jolly Janssen

Jolly Janssen

01/02/2023 15:35:57
Quote Anchor link
Begrijp hem niet helemaal. Ik wil gewoon hebben dat hij de RIJ laat zien van de laatste datum van het talent. En ik moet meer weergaves krijgen als het natuurlijk verschillende talenten zijn
 
- Ariën  -
Beheerder

- Ariën -

01/02/2023 15:42:20
Quote Anchor link
Als je meerdere weergave wilt zien, niet je in PHP wel een while() gebruiken.
 
Ivo P

Ivo P

01/02/2023 15:42:26
Quote Anchor link
Dat gaat dus niet in één query zonder subquery's.

Je kunt eest een query draaien die de laatste datum per talent ophaalt:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
SELECT talent_id, MAX(datum) FROM beoordelingen GROUP BY talent_id;


En dat joinen met een algement query:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
SELECT b.*
FROM beoordelingen b
JOIN (SELECT talent_id, MAX(datum) masdatum FROM beoordelingen GROUP BY talent_id) AS sub
  ON sub.talent_id = b.talent_id AND sub.maxdatum = b.datum


NB: ik weet even niet zeker of ik de haakjes in de join regel goed heb staan, en of "AS sub" helemaal klopt.

Toevoeging op 01/02/2023 15:44:12:

en misschien kun je nog wat leuks vinden op https://dev.mysql.com/doc/refman/8.0/en/group-by-modifiers.html
 



Overzicht Reageren

 
 

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.