[mysql] group by 2x keer gebruiken in 1 query

Pagina: 1
Acties:

  • mark_gl
  • Registratie: September 2001
  • Laatst online: 01:34
Ik heb onderstaande mysql code gebruikt om een weekagenda weer te geven. Per dag moet er één uniek agenda item worden weergegeven. Echter ik heb een probleem om in de weekagenda per dag één uniek agenda item weer te geven. Ik heb geprobeerd nog een extra GROUP BY te plaatsen, maar dit werkt niet wellicht heeft iemand een oplossing?

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT 
   A.ageID, 
   A.ageName, 
   WEEKDAY( D.ageDate ) AS ageWeekday, 
   DATE_FORMAT( D.ageDate, '%e-%c-%Y' ) AS Date, 
   C.citName
FROM (
  tblagenda AS A
  INNER JOIN tblagendadatetime AS D ON A.ageID = D.ageID
)
INNER JOIN tblcity AS C ON A.citID = C.citID
WHERE D.ageDate >= NOW( ) 
GROUP BY ageWeekday
ORDER BY D.ageDate, D.ageTime, A.ageName
LIMIT 0 , 7


edit:
even wat netter uitgelijnd. Volgende keer ff zelf doen ;)

[ Voor 8% gewijzigd door drm op 01-08-2003 14:52 ]


  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 15:58
GROUP BY veld1, veld2

:?

  • mark_gl
  • Registratie: September 2001
  • Laatst online: 01:34
Helaas werkt dit niet want dan ziet hij veld1, veld2 als één unieke waarde en krijg ik dus meerdere agenda items op ééndezelfde dag terug. Echter elke agenda item is dan wel uniek !

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Als je 1 item op een dag wilt zien dan zul je moeten beslissen welke dat moet zijn.
De vroegste?
Alfabetisch de eerste?

Who is John Galt?


  • mark_gl
  • Registratie: September 2001
  • Laatst online: 01:34
justmental schreef op 01 augustus 2003 @ 15:09:
Als je 1 item op een dag wilt zien dan zul je moeten beslissen welke dat moet zijn. De vroegste? Alfabetisch de eerste?
In principe maakt mij dit niks uit, als het maar één uniek agenda item per dag is.

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Dan kun je er bijvoorbeeld MIN(C.citName) van maken.

Who is John Galt?


  • mark_gl
  • Registratie: September 2001
  • Laatst online: 01:34
justmental schreef op 01 August 2003 @ 15:23:
Dan kun je er bijvoorbeeld MIN(C.citName) van maken.
Dan is mijn probleem nog niet opgelost !

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

mark_gl schreef op 01 August 2003 @ 15:26:
Dan is mijn probleem nog niet opgelost !
Dan heb je of de group by nog op 2 velden of ik begrijp geen zier van je probleem.

Who is John Galt?


  • whoami
  • Registratie: December 2000
  • Laatst online: 21-08 22:54
Ik begrijp er ook niets van.
Het is toch logisch dat je geen extra groepen kunt maken binnen ageId en ageName als die 2 velden uniek zijn.

Verder zie ik in je query ook geen enkele reden om een group by te gebruiken, aangezien je nergens gebruik maakt van aggregated columns.
Misschien moet je eerst eens een Sql tutorial lezen over het nut en doel van group by, want volgens mij gebruik je hem verkeerd en snap je het nog niet helemaal.

https://fgheysels.github.io/


  • mark_gl
  • Registratie: September 2001
  • Laatst online: 01:34
Ik zal het probleem met een kort voorbeeld toelichten.
(voorbeeld 1 = mijn code, voorbeeld 2 = code van justmental)

Voorbeeld 1:

SELECT A.ageID, A.ageName, WEEKDAY(D.ageDate) as ageWeekday, DATE_FORMAT(D.ageDate,'%e-%c-%Y') as Date, C.citName FROM (tblagenda as A INNER JOIN tblagendadatetime as D ON A.ageID=D.ageID) INNER JOIN tblcity as C ON A.citID=C.citID WHERE D.ageDate >= NOW() GROUP BY ageWeekday ORDER BY D.ageDate, D.ageTime, A.ageName LIMIT 0,7

Bovenstaande query geeft onderstaand resultaat:

ageWeekday, Date, ageName, citName
Vrijdag, 1-8-2003, Wieler Profronde van Heerlen, Heerlen
Zaterdag, 2-8-2003, Wielerfestijn Nacht van Waubach, Waubach
Zondag, 3-8-2003, Wielerfestijn Nacht van Waubach, Waubach
Maandag, 4-8-2003, Tiffanyshow, Kerkrade
Dinsdag, 5-8-2003, Tiffanyshow, Kerkrade
Woensdag, 6-8-2003, Tiffanyshow, Kerkrade
Donderdag, 7-8-2003, Preuf Heële, Heerlen

Voorbeeld 2:

SELECT A.ageID, A.ageName, WEEKDAY(D.ageDate) as ageWeekday, DATE_FORMAT(D.ageDate,'%e-%c-%Y') as Date, MIN(C.citName) FROM (tblagenda as A INNER JOIN tblagendadatetime as D ON A.ageID=D.ageID) INNER JOIN tblcity as C ON A.citID=C.citID WHERE D.ageDate >= NOW() GROUP BY ageWeekday ORDER BY D.ageDate, D.ageTime, A.ageName LIMIT 0,7

ageWeekday, Date, ageName, citName
Vrijdag, 1-8-2003, Wieler Profronde van Heerlen, Waubach
Zaterdag, 2-8-2003, Wielerfestijn Nacht van Waubach, Waubach
Zondag, 3-8-2003, Wielerfestijn Nacht van Waubach, Waubach
Maandag, 4-8-2003, Tiffanyshow, Kerkrade
Dinsdag, 5-8-2003, Tiffanyshow, Kerkrade
Woensdag, 6-8-2003, Tiffanyshow, Kerkrade
Donderdag 7-8-2003 Preuf Heële, Heerlen

Zoals je ziet komt er in de week agenda een agenda item vaker voor op meerdere dagen (zie tekst in bold), dit wil ik juist niet. Ik wil per dag één uniek agenda item.

  • mark_gl
  • Registratie: September 2001
  • Laatst online: 01:34
whoami schreef op 01 August 2003 @ 15:47:
Ik begrijp er ook niets van.
Het is toch logisch dat je geen extra groepen kunt maken binnen ageId en ageName als die 2 velden uniek zijn.

Verder zie ik in je query ook geen enkele reden om een group by te gebruiken, aangezien je nergens gebruik maakt van aggregated columns.
Misschien moet je eerst eens een Sql tutorial lezen over het nut en doel van group by, want volgens mij gebruik je hem verkeerd en snap je het nog niet helemaal.
Ik gebruik de GROUP BY om één agenda item per dag te krijgen
(een filtering in het resultaat dus, waarvoor de GROUP BY ook bedoeld is)

  • whoami
  • Registratie: December 2000
  • Laatst online: 21-08 22:54
Lees mijn reply nog eens: GROUP BY werkt alleen maar als je ook aggregated functies (zoals SUM, AVG, MIN, MAX, ...) gebruikt, en die gebruik je niet.

https://fgheysels.github.io/


  • mark_gl
  • Registratie: September 2001
  • Laatst online: 01:34
whoami schreef op 01 August 2003 @ 17:08:
Lees mijn reply nog eens: GROUP BY werkt alleen maar als je ook aggregated functies (zoals SUM, AVG, MIN, MAX, ...) gebruikt, en die gebruik je niet.
Bestaat er dan een andere oplossing voor mijn probleem?

  • Theguide
  • Registratie: December 2000
  • Laatst online: 26-06-2025
Je hebt toch ook 1 uniek agenda item per dag???
Die Tiffanyshow's uit je voorbeeld vinden plaats op 3 verchillende dagen.

Dus... of je legt het niet goed uit of je probleem bestaat helemaal niet :)

Fuck me if I'm wrong, but isn't your name Gretchen?


  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 21-02 23:50
hij wil kennelijk geen item op 2 verschillende dagen hebben...

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


  • mark_gl
  • Registratie: September 2001
  • Laatst online: 01:34
Grijze Vos schreef op 04 August 2003 @ 17:23:
hij wil kennelijk geen item op 2 verschillende dagen hebben...
Juist, dat wil ik inderdaad opvangen. Echter ik vind niet echt een oplossing ....

  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

Doe een GROUP BY op het item (ageNaam) en pak bijv. de MIN(datum) om het eerstvolgende event te pakken. Eventueel kan je met HAVING datums uit het verleden weglaten uit je resultaat.

Today's subliminal thought is:


  • mark_gl
  • Registratie: September 2001
  • Laatst online: 01:34
Annie schreef op 05 August 2003 @ 12:48:
Doe een GROUP BY op het item (ageNaam) en pak bijv. de MIN(datum) om het eerstvolgende event te pakken. Eventueel kan je met HAVING datums uit het verleden weglaten uit je resultaat.
Bedoel jij de volgende query:

code:
1
2
3
4
5
6
7
8
9
10
SELECT A.ageID, A.ageName, WEEKDAY(D.ageDate) AS ageWeekday, MIN(D.ageDate) AS Date, C.citName
FROM (
  tblagenda AS A
  INNER JOIN tblagendadatetime AS D ON A.ageID = D.ageID
)
INNER JOIN tblcity AS C ON A.citID = C.citID
GROUP BY A.ageName
HAVING Date >= NOW( ) 
ORDER BY D.ageDate, D.ageTime, A.ageName
LIMIT 0,7
Want dan krijg ik meerdere resultaten van één ageWeekday

[ Voor 6% gewijzigd door mark_gl op 05-08-2003 15:48 ]


  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

mark_gl schreef op 05 August 2003 @ 15:45:
[...]
Bedoel jij de volgende query:

code:
1
SELECT enz...
Uhh, ja... ongeveer ;)
De GROUP BY is wat ik in gedachten had, de rest van de SELECT daar snap ik niet zo veel van. MySQL heeft toch een heel eigen interpretatie van de functionaliteit van GROUP BY. Een gemiddelde andere database zou wat je hier laat zien niet accepteren.

Maar ik heb nog steeds niet het idee dat je helemaal begrijpt wat je aan het doen bent met de GROUP BY. Dat is natuurlijk niet erg, begrijp me niet verkeerd, maar het is misschien verstandiger eerst even goed in de materie te duiken voor je via trial-and-error probeert (evt. met hulp van ons) een recordset tevoorschijn te toveren die voldoet aan je verwachtingen. Als ik mis zit dan natuurlijk mijn excuses.

Today's subliminal thought is:


  • mark_gl
  • Registratie: September 2001
  • Laatst online: 01:34
Annie schreef op 05 augustus 2003 @ 17:19:
[...]

Uhh, ja... ongeveer ;)
De GROUP BY is wat ik in gedachten had, de rest van de SELECT daar snap ik niet zo veel van. MySQL heeft toch een heel eigen interpretatie van de functionaliteit van GROUP BY. Een gemiddelde andere database zou wat je hier laat zien niet accepteren.

Maar ik heb nog steeds niet het idee dat je helemaal begrijpt wat je aan het doen bent met de GROUP BY. Dat is natuurlijk niet erg, begrijp me niet verkeerd, maar het is misschien verstandiger eerst even goed in de materie te duiken voor je via trial-and-error probeert (evt. met hulp van ons) een recordset tevoorschijn te toveren die voldoet aan je verwachtingen. Als ik mis zit dan natuurlijk mijn excuses.
Je hebt 't inderdaad mis, maar toch bedankt voor je moeite :)

  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

mark_gl schreef op 07 August 2003 @ 08:52:
[...]
Je hebt 't inderdaad mis, maar toch bedankt voor je moeite :)
Ah, je hebt de oplossing dus gevonden?

Today's subliminal thought is:

Pagina: 1