[PHP/MySQL] groeperen/sorteren lukt niet

Pagina: 1
Acties:
  • 121 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben momenteel een module in PHP aan het schrijven, om per pagina statistieken bij te houden. Bij het overzicht wil ik groeperen op sessie, en binnen die groepen wil ik sorteren op tijd.

Nou krijg ik wel alles gesorteerd op tijd, maar dan worden de sessies niet gegroepeerd. Als ik de sessie wel gegroepeerd heb, is alleen de tijd binnen een groep gesorteerd, maar niet over het gehele resultaat.

Aan de hand van een eenvoudig voorbeeldje zal ik proberen duidelijk te maken wat het resultaat moet zijn.

Input:
code:
1
2
3
4
5
6
7
8
9
10
11
Sessie  Tijd
--------------------
A       2004
A       2000
B       2001
B       2003
B       2005
C       2006
A       2002
C       2007
C       2008


Output:
code:
1
2
3
4
5
6
7
8
9
10
11
Sessie  Tijd
--------------------
C       2008
C       2007
C       2006
B       2005
B       2003
B       2001
A       2004
A       2002
A       2000

[ Voor 4% gewijzigd door Verwijderd op 07-04-2004 10:07 ]


Acties:
  • 0 Henk 'm!

  • MeIsTwisted
  • Registratie: November 2001
  • Laatst online: 28-07-2023

MeIsTwisted

not a Twisted mind

wat is je query?
want als je die goed doet moet het kunnen

Multimonitor is relax :P


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Sorry, had de output ook nog verkeerd opgeschreven... ;)

De query is (vereenvoudigd):
code:
1
SELECT * FROM tabel GROUP BY sessie, ID ORDER BY tijd DESC


Eerst moeten dus de groepen samengepakt worden, maar dan krijg je natuurlijk maar 1 resultaat per groep. Dus groep ik ook nog eens op de PK van de tabel, zodat ik genoeg resultaten krijg. Het visueel aanbrengen van groepen gebeurt in de PHP-code, maar als ik niet groeper en alleen sorteer op tijd, dan krijg ik dus meerdere keren een "groep" met dezelfde sessienaam op het scherm.

[ Voor 55% gewijzigd door Verwijderd op 07-04-2004 10:12 ]


Acties:
  • 0 Henk 'm!

  • sjoerdb2
  • Registratie: Juli 2001
  • Laatst online: 09-05 09:52
SELECT Tijd, Sessie FROM tabel ORDER BY Sessie,Tijd DESC;

[ Voor 17% gewijzigd door sjoerdb2 op 07-04-2004 10:11 ]


Acties:
  • 0 Henk 'm!

  • ripexx
  • Registratie: Juli 2002
  • Laatst online: 21-09 17:49

ripexx

bibs

Kijk eens naar order by, voorbeeld
SQL:
1
2
3
SELECT sessie, tijd
FROM stats
ORDER BY sessie DESC, tijd DESC;
Verwijderd schreef op 07 april 2004 @ 10:10:
Sorry, had de output ook nog verkeerd opgeschreven... ;)

De query is (vereenvoudigd):
code:
1
2
3
4
SELECT * 
FROM tabel 
GROUP BY sessie, ID 
ORDER BY tijd DESC
Waarom gebruik je nu een group by? Deze heeft namelijk een hele andere functie. ;)

[ Voor 60% gewijzigd door ripexx op 07-04-2004 10:12 ]

buit is binnen sukkel


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 21-09 02:21

Janoz

Moderator Devschuur®

!litemod

Je bedoeld dat je gewoon op 2 velden wilt sorteren? Groeperen lijkt me in deze context niet de juiste term. Dat wordt gebruikt bij aggregate functions (max min arg sum ed). Maar iig, het resultaat is gewoon te verkrijgen door beide velden in de order by op te nemen.

--Edit --

Ik zie dat er al weer wat meer reacties staan.

groupby betekent niet dat je ze bij elkaar neer zet. Group by wordt gebruikt om records samen te nemen in 1 record. Je zou in dit geval op sessie kunnen groeperen, maar dan 1 berekende waarde van de tijd bepalen. Een normaal rdms zou ook een dikke foutmelding opgooien omdat niet alle variabele velden in de group by waren opgenomen..

[ Voor 44% gewijzigd door Janoz op 07-04-2004 10:13 ]

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Pathogen
  • Registratie: April 2004
  • Laatst online: 15-09 10:06

Pathogen

Shoop Da Whoop

Edit: wat lul ik nou...

order by tijd DESC, sessie DESC (of andersom)

veel plezier

[ Voor 78% gewijzigd door Pathogen op 07-04-2004 10:14 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Groeperen is volgens mij echt vereist, want anders krijg ik in de resultatentabel niet netjes alle sessies bij elkaar.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Thrackan schreef op 07 april 2004 @ 10:12:
geef je nu 2 group by argumenten mee??
Ja, anders krijg ik maar 1 resultaat per sessie en ik wil alle resultaten uit de tabel hebben.

Acties:
  • 0 Henk 'm!

  • MeIsTwisted
  • Registratie: November 2001
  • Laatst online: 28-07-2023

MeIsTwisted

not a Twisted mind

Verwijderd schreef op 07 april 2004 @ 10:13:
Groeperen is volgens mij echt vereist, want anders krijg ik in de resultatentabel niet netjes alle sessies bij elkaar.
nee hoor, want je sorteert eerst op sessie, dus alle A's komen netjes bij elkaar en alle B's ook.

Multimonitor is relax :P


Acties:
  • 0 Henk 'm!

  • Pathogen
  • Registratie: April 2004
  • Laatst online: 15-09 10:06

Pathogen

Shoop Da Whoop

Verwijderd schreef op 07 april 2004 @ 10:14:
[...]

Ja, anders krijg ik maar 1 resultaat per sessie en ik wil alle resultaten uit de tabel hebben.
Zie mn edit ;)

Acties:
  • 0 Henk 'm!

  • ripexx
  • Registratie: Juli 2002
  • Laatst online: 21-09 17:49

ripexx

bibs

Verwijderd schreef op 07 april 2004 @ 10:13:
Groeperen is volgens mij echt vereist, want anders krijg ik in de resultatentabel niet netjes alle sessies bij elkaar.
Nee je sorteerd eerst op de sessie, zodat deze bij elkaar staan en dan pas op tijd. Kijk eens in de manuals want een group by heeft een hele andere functie ;) Zie ook de post van Janoz ergens hier boven :)

[ Voor 6% gewijzigd door ripexx op 07-04-2004 10:17 ]

buit is binnen sukkel


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ken de functies ook wel redelijk allemaal...

Maar jullie begrijpen het niet goed volgens mij. De volgorde van de sessie boeit me totaal niet (dat zijn gewoon 32 "willekeurige" bytes) en de waarde ervan is voor de gebruiker totaal niet interessant. Sorteren op sessie is dus niet belangrijk. Maar het is wel belangrijk dat alle resultaten van een bepaalde sessie bij elkaar staan, en dat de sessies gesorteerd worden op volgorde van de tijden die erbij horen.

Acties:
  • 0 Henk 'm!

  • ripexx
  • Registratie: Juli 2002
  • Laatst online: 21-09 17:49

ripexx

bibs

Verwijderd schreef op 07 april 2004 @ 10:19:
Ik ken de functies ook wel redelijk allemaal...

Maar jullie begrijpen het niet goed volgens mij. De volgorde van de sessie boeit me totaal niet (dat zijn gewoon 32 "willekeurige" bytes) en de waarde ervan is voor de gebruiker totaal niet interessant. Sorteren op sessie is dus niet belangrijk. Maar het is wel belangrijk dat alle resultaten van een bepaalde sessie bij elkaar staan, en dat de sessies gesorteerd worden op volgorde van de tijden die erbij horen.
Je wilt de sessie bij elkaar hebben staan -> order by ze staan dan namelijk in een bepaalde volgorde bij elkaar, dat jouw die volgorde niet uitmaakt is niet relevant. Daarna een order by op de tijd en de sortering is compleet. Run de query met order ipv group by eens en kijk dan naar het resultaat. :)

buit is binnen sukkel


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dat heb ik uiteraard al gedaan, maar dan staan bijvoorbeeld sessies van 1 april boven die van 5 april en daarna komen er weer sessies van 1 en 2 april bijvoorbeeld.

Het is dus de bedoeling dat de meeste recente sessie bovenaan staat.

Acties:
  • 0 Henk 'm!

  • MeIsTwisted
  • Registratie: November 2001
  • Laatst online: 28-07-2023

MeIsTwisted

not a Twisted mind

Verwijderd schreef op 07 april 2004 @ 10:27:
Dat heb ik uiteraard al gedaan, maar dan staan bijvoorbeeld sessies van 1 april boven die van 5 april en daarna komen er weer sessies van 1 en 2 april bijvoorbeeld.

Het is dus de bedoeling dat de meeste recente sessie bovenaan staat.
waar staat dan over die data?

je kan ook sorteren op datum :)

Multimonitor is relax :P


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ok, ik sla het in de database op als UNIX timestamp. maar om het te vereenvoudigen heb ik hier 'tijd' neergezet.

als ik dus sorteer op datum, dan worden de sessies weer neit bij elkaar gepakt...

Acties:
  • 0 Henk 'm!

  • Sosabowski
  • Registratie: Juni 2003
  • Laatst online: 18-09 21:03

Sosabowski

nerd

daarom moet je eerst op sessie sorteren en dan op datum/timestamp

GROUP BY doet echt iets anders

The whole problem with the world is that fools and fanatics are always so certain of themselves, and wiser people so full of doubts. -- Bertrand Russell


Acties:
  • 0 Henk 'm!

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Kun je anders even je tabel posten. Misschien dat er dan wat minder misverstanden zijn.

Enne een GROUP BY op sessie zorgt ervoor dat je per sessie maar één record terugkrijgt, dus je zult het echt met een ORDER BY op moeten lossen.

Never underestimate the power of


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Zoals ik al eerder zei: dan krijg je dus zoiets: (.... staat voor de overige gegevens, die nu niet relevant zijn)

code:
1
2
3
4
5
6
7
8
9
10
11
12
Sessie A
  1 april ....
  1 april ....
  1 april ....
Sessie B
   5 april ....
   5 april ....
   5 april ....
Sessie C
   2 april ....
   2 april ....
   2 april ....


In dit geval zou de volgorde B-C-A moeten zijn.

[ Voor 3% gewijzigd door Verwijderd op 07-04-2004 11:01 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
cameodski schreef op 07 april 2004 @ 10:58:
Kun je anders even je tabel posten. Misschien dat er dan wat minder misverstanden zijn.

Enne een GROUP BY op sessie zorgt ervoor dat je per sessie maar één record terugkrijgt, dus je zult het echt met een ORDER BY op moeten lossen.
daarom wilde ik ook groeperen op sessie en vervolgens op de PK van die tabel, want die is uniek.

Acties:
  • 0 Henk 'm!

  • Sosabowski
  • Registratie: Juni 2003
  • Laatst online: 18-09 21:03

Sosabowski

nerd

ORDER BY
GROUP BY

tabel:
code:
1
2
3
4
5
6
Company     OrderNumber
------------------------------------
Sega         3412
ABC Shop     5678
W3Schools   2312
W3Schools   6798


Query:
code:
1
2
SELECT Company, OrderNumber FROM Orders
ORDER BY Company DESC, OrderNumber ASC


Result:
code:
1
2
3
4
5
6
Company     OrderNumber
--------------------------------
W3Schools   2312
W3Schools   6798
Sega         3412
ABC Shop     5678

[ Voor 62% gewijzigd door Sosabowski op 07-04-2004 11:08 ]

The whole problem with the world is that fools and fanatics are always so certain of themselves, and wiser people so full of doubts. -- Bertrand Russell


Acties:
  • 0 Henk 'm!

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Verwijderd schreef op 07 april 2004 @ 11:02:
daarom wilde ik ook groeperen op sessie en vervolgens op de PK van die tabel, want die is uniek.
Maar als je de PK opneemt, heeft je GROUP BY geen effect meer.
Jammer dat MySQL zo'n query pikt |:(

Je zult eerst per sessie de nieuwste datum/tijd moeten bepalen, maar de enige manier die ik kan bedenken om dat op te lossen, is met een subquery.
Maar subqueries zijn nog wel eens een probleem in MySQL.

Never underestimate the power of


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
tabelscructuur:
code:
1
2
3
4
5
6
7
staID  bigint(20)   <------ primary key, unique
pagID  int(11)
sesID  varchar(32)         
staTimestamp  timestamp(14)
staIPaddress  varchar(15)
pagName  varchar(255)
pagURL  varchar(255)


stukje gegevens:
code:
1
2
3
4
5
6
7
8
9
192, 66, f0483b4ab7faa4d4463fe8ff7ded1649 20040401163050, 192.168.0.103, Introduction, %2Fcms-v3%2Fpage.php%3FpagID%3D66%26newID%3D24

193, 66, f0483b4ab7faa4d4463fe8ff7ded1649 20040401163051, 192.168.0.103, Introduction, %2Fcms-v3%2Fpage.php%3FpagID%3D66%26men1ParentID%3...

194, 66, f0483b4ab7faa4d4463fe8ff7ded1649 20040401163052, 192.168.0.103, Introduction, %2Fcms-v3%2Fpage.php%3FpagID%3D66%26newID%3D23

195, 54, 37cb9036638b1df0708a38eb55e47889 20040401163314, 192.168.0.107, lalala, %2Fcms-v3%2Fpage.php%3FpagID%3D54

196, 62, 37cb9036638b1df0708a38eb55e47889 20040401163416, 192.168.0.107, euh, %2Fcms-v3%2Fpage.php%3FpagID%3D62

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
cameodski schreef op 07 april 2004 @ 11:08:
[...]

Maar als je de PK opneemt, heeft je GROUP BY geen effect meer.
Jammer dat MySQL zo'n query pikt |:(

Je zult eerst per sessie de nieuwste datum/tijd moeten bepalen, maar de enige manier die ik kan bedenken om dat op te lossen, is met een subquery.
Maar subqueries zijn nog wel eens een probleem in MySQL.
Dat weet ik, daarom probeerde ik het met group by te omzeilen. Ik denk dus dat het niet mogelijk zal zijn met MySQL, dus er zal wel wat aan de PHP-code moeten gebeuren.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
IorGie schreef op 07 april 2004 @ 11:04:
ORDER BY
GROUP BY

tabel:
code:
1
2
3
4
5
6
Company     OrderNumber
------------------------------------
Sega         3412
ABC Shop     5678
W3Schools   2312
W3Schools   6798


Query:
code:
1
2
SELECT Company, OrderNumber FROM Orders
ORDER BY Company DESC, OrderNumber ASC


Result:
code:
1
2
3
4
5
6
Company     OrderNumber
--------------------------------
W3Schools   2312
W3Schools   6798
Sega         3412
ABC Shop     5678
In jouw voorbeeld zou ik dus op ordernummer willen sorteren.

Acties:
  • 0 Henk 'm!

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 21-09 18:44

gorgi_19

Kruimeltjes zijn weer op :9

Dan wissel je OrderNumber en Company met elkaar om in de ORDER BY Clausule?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Acties:
  • 0 Henk 'm!

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Verwijderd schreef op 07 april 2004 @ 11:11:
Dat weet ik, daarom probeerde ik het met group by te omzeilen. Ik denk dus dat het niet mogelijk zal zijn met MySQL, dus er zal wel wat aan de PHP-code moeten gebeuren.
Kun je trouwens de sessies niet in een aparte tabel zetten, waarin je dan de nieuwste datum/tijd zet.
Of iets met een tijdelijke tabel zou wellicht ook nog kunnen.

Dan heb je dus wel meerdere queries, maar zo zou het wel kunnen.
Het aan de php kant oplossen, lijkt me ook niet bepaald een aantrekkelijke optie.

Jammer dat je trouwens geen RDBMS gebruikt die gewoon subqueries ondersteunt.

Never underestimate the power of


Acties:
  • 0 Henk 'm!

  • beetle71
  • Registratie: Februari 2003
  • Laatst online: 09-09 15:24
Volgens mij doet dit wat je wilt:
code:
1
2
3
SELECT max(t1.tijd) as maximum, t2.tijd, t1.sessie as main 
FROM stats as t1 LEFT OUTER JOIN stats as t2 ON t1.sessie=t2.sessie
GROUP BY t2.id,t1.sessie order by maximum desc,tijd desc

edit:

Stond nog foutje in

[ Voor 13% gewijzigd door beetle71 op 07-04-2004 12:18 ]


Acties:
  • 0 Henk 'm!

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
beetle71 schreef op 07 april 2004 @ 12:02:
Volgens mij doet dit wat je wilt:
code:
1
2
3
SELECT max(t1.tijd) as maximum, t2.tijd, t1.sessie as main 
FROM stats as t1 LEFT OUTER JOIN stats as t2 ON t1.sessie=t2.sessie
GROUP BY t2.id,t1.sessie order by maximum desc,tijd desc
Mmm, op die manier had ik het nog niet bekeken. Volgens mij moet ie nog wel heel iets anders:
code:
1
2
3
4
5
SELECT MAX(t1.tijd) AS maximum, t2.tijd, t1.sessie AS main
FROM stats t1
INNER JOIN stats t2 ON t1.sessie = t2.sessie
GROUP BY t1.sessie, t2.tijd
ORDER BY maximum DESC, t2.tijd DESC

Never underestimate the power of

Pagina: 1