[mysql] GROUP BY met uitzondering

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • snader2
  • Registratie: Juni 2008
  • Laatst online: 21-09 21:56
Ik heb al flink gegoogled en wat documentatie doorgelezen maar kom er niet aan uit.
Ik wil een group by doen op een tabel maar wil dat hij geen group by doet voor rijen waar de waarde 0 is.
Even een voorbeeldje:
IDID_GROEPNAAM
10piet
22flip
30jan
42klaas
52henk
61kees


Waarvan ik dus als resultaat wil hebben:
code:
1
SELECT  * FROM `table` GROUP BY ID_GROEP; //....nog iets toevoegen zodat hij 0 niet meeneemt


IDID_GROEPNAAM
10piet
22flip
30jan
61kees


Dus alles met meer voorkomende ID_GROEP (INT) word samen gevoegd behalve die met de waarde 0.
Hoe krijg ik dat voor elkaar?

Acties:
  • 0 Henk 'm!

  • moozzuzz
  • Registratie: Januari 2005
  • Niet online
Is het wel verstandig te groupen op ID_GROUP (in jouw voorbeeld) maar met een at random NAAM (in jouw voorbeeld)? Ik geloof dat MySQL er wel mee weg komt, maar andere RDB beginnen dan te vloeken :^)

Acties:
  • 0 Henk 'm!

  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

Ik zou denken een simpele where clause?

SQL:
1
... WHERE ID_GROEP <> 0

Blog [Stackoverflow] [LinkedIn]


Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 15:11
In dit geval zou je de speciale waarde NULL moeten willen gebruiken.
Die reageert ook precies zoals jij wilt.

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
snader2 schreef op vrijdag 06 mei 2011 @ 15:51:
Dus alles met meer voorkomende ID_GROEP (INT) word samen gevoegd behalve die met de waarde 0.
Hoe krijg ik dat voor elkaar?
Wat wil je dan dat er met de rijen met waarde 0 gebeurt? Wil je die gewoon niet zien? Dan kan je idd gewoon een where clause toevoegen die er op controleert.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • snader2
  • Registratie: Juni 2008
  • Laatst online: 21-09 21:56
@moozzuzz
ja ik wil het zo doen omdat die bij elkaar horen en zodra er mensen bij elkaar horen wil ik een groep item laten zien ipv een los item. Dit vang ik dan af met php if ID_GROEP!=0.....

@Wolfboy
Dan krijg ik alleen die met ID_GROEP = 1 of 2 of 2 terug.

@frickY
Het probleem is dat het een INT is dus dan zou ik er een Varchar ofzo van moeten maken? Dan zou het wel werken? Ik ga het proberen.
edit: moet gewoon NULL aanzetten natuurlijk...

@Woy
Nee dan was het makkelijk, nee ik wil die juist wel zien maar niet gegroepeerd.

[ Voor 35% gewijzigd door snader2 op 06-05-2011 16:05 ]


Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 15:11
Groep 0 is nog steeds een groep. Sla null op als er geen groep is, en je probleem is opgelost.

NULL is geen string, maar een eigenschap van een veld. Je kunt je INT-veld dus ook nullable maken.

[ Voor 36% gewijzigd door frickY op 06-05-2011 16:06 ]


Acties:
  • 0 Henk 'm!

  • snader2
  • Registratie: Juni 2008
  • Laatst online: 21-09 21:56
@frickY
Nee helpt niet krijg nu dus gewoon:
NULL
1
2

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Sowieso klopt de sql die je post in je TS al niet
SQL:
1
SELECT  * FROM `table` GROUP BY ID_GROEP;

Zie daarvoor: Hoe werkt dat GROUP BY nu eigenlijk? ( Als je groepeert moet je de velden die niet in de group by opgenomen zijn door een aggregate function halen )

Ik denk dat je iets van een UNION wil doen
SQL:
1
2
3
4
5
6
7
8
SELECT GroupId, MAX( veld)
FROM Tabel
WHERE NOT GroupId = 0
GROUP BY GroupId
UNION
SELECT GroupId, veld
FROM Table
WHERE GroupId = 0

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • RuudvandeBeeten
  • Registratie: Oktober 2007
  • Laatst online: 16-10-2024
Na een paar keer je vraag te hebben gelezen snap ik hem.

Het voorbeeld wat Woy geeft is precies wat je zoekt.

Acties:
  • 0 Henk 'm!

  • snader2
  • Registratie: Juni 2008
  • Laatst online: 21-09 21:56
@ Woy
Dat het niet klopt begrijp ik maar maakt me niet zoveel uit omdat ik voor elke keer dat de groep_id ongelijk aan 0 is toch nog een losse query doe om alle groepsleden te pakken.

Bedankt denk dat het met die UNION gaat lukken ik ga even testen en laat het jullie weten. Sorry voor mijn niet duidelijke uitleg.

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
snader2 schreef op vrijdag 06 mei 2011 @ 16:19:
@ Woy
Dat het niet klopt begrijp ik maar maakt me niet zoveel uit omdat ik voor elke keer dat de groep_id ongelijk aan 0 is toch nog een losse query doe om alle groepsleden te pakken.
Als het niet uit haalt welke waarde je terug krijgt, waarom selecteer je hem dan überhaupt? Bedenk wel dat door op dit soort gedrag te vertrouwen, je best kans hebt dat je systeem van de een op de andere dag opeens niet meer werkt!

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • RuudvandeBeeten
  • Registratie: Oktober 2007
  • Laatst online: 16-10-2024
snader2 schreef op vrijdag 06 mei 2011 @ 16:19:
@ Woy
Dat het niet klopt begrijp ik maar maakt me niet zoveel uit omdat ik voor elke keer dat de groep_id ongelijk aan 0 is toch nog een losse query doe om alle groepsleden te pakken.

Bedankt denk dat het met die UNION gaat lukken ik ga even testen en laat het jullie weten. Sorry voor mijn niet duidelijke uitleg.
Waarom maak je niet 1 query die gelijk alle groepsleden al voor je pakt? In de code zou bij het doorlopen van het resultaat de groep kunnen bijhouden en eventuele logica kunnen toepassen. :)

In dat geval ben je met 1 query naar de database klaar.

Acties:
  • 0 Henk 'm!

  • Davio
  • Registratie: November 2007
  • Laatst online: 06-01 16:46
GROUP BY gaat toch altijd samen met HAVING ipv WHERE?

Je zou voor het group stukje dan kunnen doen:

SELECT * FROM `table`
GROUP BY ID_GROEP
HAVING ID_GROEP <> 0

Dan zou je nog een selfjoin kunnen doen met alle normale rijen die juist wel waarde 0 hebben.

Acties:
  • 0 Henk 'm!

  • snader2
  • Registratie: Juni 2008
  • Laatst online: 21-09 21:56
Bedankt ik heb het werkend gekregen, ik ga nog even kijken of ik het netter kan maken want inderdaad het kan voor problemen zorgen in de toekomst.

@Ruud
Omdat ik ook een count gebruik voor het aantal paginas, en dan klopt dit niet meer.

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Davio schreef op vrijdag 06 mei 2011 @ 16:54:
GROUP BY gaat toch altijd samen met HAVING ipv WHERE?
HAVING word pas achteraf uitgevoerd, nadat de aggregate functions zijn uitgevoerd, en dus makkelijk als je bijvoorbeeld wil filteren aan de hand van een aggregate function. De WHERE clause is bedoeld om de initiele rijen te filteren.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • snader2
  • Registratie: Juni 2008
  • Laatst online: 21-09 21:56
edit: vraag verwijderd, heb de fout al gevonden.

[ Voor 82% gewijzigd door snader2 op 06-05-2011 17:14 ]


Acties:
  • 0 Henk 'm!

  • Precision
  • Registratie: November 2006
  • Laatst online: 12-08 21:08
max() haalt het grootste element op uit je groep
count() telt het aantal elementen in je groep
Het is niet de bedoeling dat je je max() nest in count() dus count(max(id)). Linkje over de functies
edit:
hmm die nieuwe functie in het forum die toont of er nieuwe posts zijn zorgt ervoor dat je niet meer refresht en ziet dat iemand zijn reactie heeft gewijzigd/verwijderd :P

[ Voor 16% gewijzigd door Precision op 06-05-2011 17:32 ]

Crisis? Koop slim op Dagoffer - Op zoek naar een tof cadeau?


Acties:
  • 0 Henk 'm!

  • ReenL
  • Registratie: Augustus 2010
  • Laatst online: 14-09-2022
@Davio:
Having is voor group functies. Je kan niet zeggen "HAVING colname = 1", misschien in MySQL, maar dat zal wel weer afhankelijk zijn van een instelling als ONLY_FULL_GROUP_BY.

De query van woy is dus correct.

Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 15:11
Dat werkt prima in MySQL, en volgens mij in ieder ander DBMS.
HAVING is identiek aan WHERE, behalve dat deze op de resultset werkt na alle joins en aggregraties, in plaats van tijdens het opbouwen van die resultset.

De ONLY_FULL_GROUP_BY-setting is om een feature in MySQL uit te zetten waardoor je non-aggregrated en non-grouped values in je select mag gebruiken, zoals in andere databases. Slaat dus niet op de GROUP BY (of HAVING) zelf.

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Alternatief kan je ook GROUP BY GroupID, IF(GroupID=0,ID,1) gebruiken als je geen union wilt.

{signature}

Pagina: 1