02. juli 2009 - 08:57Der er
7 kommentarer og 2 løsninger
MSSQL og GROUP?
Hejsa
Jeg har lidt et problem med MSSQL og dens maade at fortolke GROUP BY.
Jeg har googlet siden kl 08:30 imorges, og nu er klokken 12:22 her i Indien, saa jeg er ved at vaere godt traet af det.
Jeg har denne query:
SELECT location, datetime, session_id, id, username FROM activity WHERE (datetime >= '1246473000') GROUP BY session_id ORDER BY id DESC
Hvordan faar jeg den til at grupere det sammen, altsaa ligesom group by fungerer i MySQL?
Jeg faar denne fejl:
Warning: mssql_query() [function.mssql-query]: message: Column 'activity.location' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause. (severity 16) in D:\HSE2\class\db.class.php on line 87
Warning: mssql_query() [function.mssql-query]: message: Column 'activity.datetime' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause. (severity 16) in D:\HSE2\class\db.class.php on line 87
Warning: mssql_query() [function.mssql-query]: message: Column 'activity.id' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause. (severity 16) in D:\HSE2\class\db.class.php on line 87
Warning: mssql_query() [function.mssql-query]: message: Column 'activity.username' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause. (severity 16) in D:\HSE2\class\db.class.php on line 87
Jeg giver maaske lidt mange points, men jeg vil ogsaa meget gerne have en udfoerlig forklaring paa hvad problemet er sammen med loesningen :) - Det skader jo ikke noget at laere noget ;)
Okay, hvis jeg saa ikke skal manipulere min anden data, men bare slaa alle med samme session_id sammen, hvad skal jeg saa goere? Group by er aabenbart ikke maaden at goere det paa saa?
Jeg ved ikke hvad du ønsker at få ud af din query, men som udgangspunkt skal man gruppere på alle ikke-aggragerede felter i sin query (dvs. sum, count m.m.)
Okay.. Jeg skal lave et system der skal tracke brugeres gang paa en side. Det er det system jeg skal have lavet en frontend til, altsaa saa administratoren kan se hvordan brugerene bevaeger sig rundt. Derfor skal jeg praesentere ham for nogle informationer om hver enkelt bruger, og vise den senste placering af brugeren.
Det har resulteret i at jeg har et lille ton poster i min database, og dem skal jeg have kvaernet sammen saa det bliver til en, i stil med:
Username Last location Time Pages in this visit asn24 index.php 05:30:00 24 (dette er et link til at se udspiciferet information om denne brugers faerden)
I MySQL havde jeg bare lavet min query saadan her:
SELECT *, COUNT(id) FROM activity WHERE datetime >= datetime >= '" . mktime(0,0,0,date("n"), date("j"), date("Y")) . "' GROUP BY session_id
og saa ville jeg faa et resultat i stil med det ovenstaaende.
Når man bruger group by (og det gælder alle databaser, inklusiv mySQL), så SKAL man referere til alle de ikke-aggragerte felter man ønsker at querien skal returnere. Ellers har serveren ikke en chance til at vide hvad du ønsker at returnere.
hvad med:
select session_id, Username, max(time), count(session) from activity group by session_id, Username
select a.session_id, a.username, max(datetime) as max_time, count(session), s.location from activity a join activity s ON s.session=a.session and s.datetime=max_time where a.datetime >= xxxxx
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.