Archief - PHP : Manipuleren van GROUP BY

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Fr3aK

Legacy Member
Is er een manier om het GROUP BY statement te manipuleren?
Je krijgt altijd maar 1 resultaat maar hoe kan ik bepalen of dat resultaat hetgeen is met het hoogste id of de laatste datum?

Alvast bedankt.

Fr3aK

Legacy Member
DarkBone zei:
Door er een ORDER BY bij te plaatsen !
Tzit ingewikkelder inneen denk ik... :sad:

Ik JOIN 3 tabellen, uiteindelijk heb ik een resultaat als volgend:
Code:
f.id | f.naam | f.omschrijving | f.icon | t.last_datum | t.last_uid | u.nickname
Ik doe een GROUP BY op een kolom (t.fid) uit een gejoinde tabel, in die gejoinde tabel zit ook t.last_datum.

Nu, als ik sorteer op t.last_datum sorteert hij nadat hij gegroepeerd heeft, het resultaat is dat hij tijdens het groeperen de rij met het laagste id neemt en dus ook de laagste datum.
Ik wil dat hij degene neemt met de hoogste datum en dat blijkt niet te lukken.

Khoop dat het wat verstaanbaar is. :unsure:

JEy

Legacy Member
Kan zeker properder, maar dit werkt tenminste ;)

Code:
SELECT * FROM (SELECT * FROM `tabel` ORDER BY `datum` DESC) AS `gesorteerd` GROUP BY `id`

WHiSPy

Legacy Member
Een group by gebeurt _ALTIJD_ voor een order by, zodus je zal 't op een andere manier moeten oplossen... :)

DarkBone

Legacy Member
Inderdaad, ik had te snel geantwoord. 't Is alweer ff geleden dat ik met SQL bezig was.

*Excuses, more excuses... *

:D

Fr3aK

Legacy Member
Wat gaat er dan precies mis?

Dit is de query:
PHP:
SELECT f.id, f.naam, f.omschrijving, f.icon, t.last_datum, t.last_uid, u.nickname
FROM forum f
LEFT JOIN topic t ON (f.id = t.fid)
LEFT JOIN user u ON (t.last_uid = u.id)
GROUP BY t.fid
ORDER BY t.last_datum DESC

Als ik de GROUP BY weg laat is dit het resultaat, met de GROUP BY ziet het er zo uit.
Foutje van mysql of is het de bedoeling dat het zo werkt?

killgore

Legacy Member
WHERE t.last_datum=MAX(t.last_datum)

of een gelijkaardige functie die met date-velden overweg kan (dunno of max dit kan)

edit: dat is dus de (denk ik) snelste oplossing, andere oplossing vind je snel als je beseft dat GROUP BY ook onmiddelijk een ORDER BY doet ;).

edit2: moest et niet duidelijk zijn: GROUP BY t.last_datum,t.fid :p

edit3: wees es wat consistenter in je namen: ofwel engels, ofwel nl he ;). Het toppunt is dan wel dat je in 1 veld zowel engels als nl gebruikt :p (last_datum dus ;))

Kn0t

Legacy Member
Tiens, ik dacht dat je bij een GROUP BY geen kolommen mocht selecteren die niet in de GROUP BY clause staan, tenzij je er een aggregaatfunctie (max, min, sum, ...) op toepast. Zo was dat toch alleszinds tijdens de SQL lessen op school (MSSQL wel).

killgore

Legacy Member
Kn0t zei:
Tiens, ik dacht dat je bij een GROUP BY geen kolommen mocht selecteren die niet in de GROUP BY clause staan, tenzij je er een aggregaatfunctie (max, min, sum, ...) op toepast. Zo was dat toch alleszinds tijdens de SQL lessen op school (MSSQL wel).
eh, omgekeerd

MAX, MIN, SUM, COUNT, ... mag je enkel toepassen als er een group by in het spel zit ;).

Das zowat enige beperking die ik ken in dit systeem

enkel voor count is er een uitzondering d8 ik. (nl. COUNT(*))

Kn0t

Legacy Member
'k ben het eens gaan opzoeken op msdn en voor mssql is het in elk geval zoals ik hierboven heb gezegd.

GROUP BY Clause

Specifies the groups into which output rows are to be placed and, if aggregate functions are included in the SELECT clause <select list>, calculates a summary value for each group. When GROUP BY is specified, either each column in any non-aggregate expression in the select list should be included in the GROUP BY list, or the GROUP BY expression must match exactly the select list expression.

Maar bon, bij mysql kan het dan wel zekers :p

killgore

Legacy Member
Kn0t zei:
'k ben het eens gaan opzoeken op msdn en voor mssql is het in elk geval zoals ik hierboven heb gezegd.

Maar bon, bij mysql kan het dan wel zekers :p
dan snap ik eigenlijk het nut van een group by niet :unsure:.

edit: wat bedoelen ze met non-aggegrate expression?

killgore

Legacy Member
BertG zei:
Denk da je bedoeld bv: "GROUP BY * HAVING voorwaarde"

Hiermee kan je voorwaardes leggen op je group by
link: http://www.w3schools.com/sql/sql_groupby.asp
my fault, waar ik WHERE gebruikte moet het idd HAVING zijn, aangezien MAX wordt gebruikt in die voorwaarde.

Maar HAVING legt géén voorwaarden op jouw group by ;). Het is op dat vlak gewoon een where waar je functies kan gebruiken die gebonden zijn aan group by (effe opgezocht: in std sql kan je in having-instructies enkel velden gebruiken die in group by expression staan)
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan