/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
Hvordan sortere jeg før GROUP BY...?
Fra : Magnus


Dato : 10-01-04 18:31

Jeg har en række poster med felterne en dato, en kategori og et par andre
felter.
Så vil jeg have vist den nyeste post i hver kategori.

Hvordan gør jeg de med MySQL

SQL = "SELECT * FROM Afstemning ORDER BY dato DESC GROUP BY kategori"


/Magnus



 
 
Morten Brynjolf (10-01-2004)
Kommentar
Fra : Morten Brynjolf


Dato : 10-01-04 20:34

"Magnus" <arnason@email.dk> wrote in news:btpcrs$p59$1@news.cybercity.dk:

> Hvordan gør jeg de med MySQL
>
> SQL = "SELECT * FROM Afstemning ORDER BY dato DESC GROUP BY kategori"

Byt om på ORDER BY og GROUP BY:
SQL = "SELECT * FROM Afstemning GROUP BY kategori ORDER BY dato DESC"

Med venlig hilsen
Morten Brynjolf

Jesper Stocholm (10-01-2004)
Kommentar
Fra : Jesper Stocholm


Dato : 10-01-04 21:46

Magnus wrote :

> Jeg har en række poster med felterne en dato, en kategori og et par
> andre felter.
> Så vil jeg have vist den nyeste post i hver kategori.
>
> Hvordan gør jeg de med MySQL
>
> SQL = "SELECT * FROM Afstemning ORDER BY dato DESC GROUP BY kategori"

For at kunne lave en group by skal du have en "Aggregate" funktion på de
øvrigt felter, dvs fx SUM, AVG eller MAX

Jeg har lavet en test på en tabel med to kolonner, kategori samt Dato.
Kategori er af typen int og Dato er af typen datetime. Der er indsat
forskellige rækker med forskellige katogorier og datoer.

Denne SQL

SELECT
   kategori,MAX(Dato)
FROM
   test_kategori
GROUP BY
   kategori
ORDER BY
   kategori

Det giver resultatet
kategori Dato
1    2004-01-10 21:46:05
2    2004-01-10 21:46:01
3    2004-01-10 21:46:08
5    2004-01-10 21:45:58

Det er lavet på MSSQL, men jeg kan ikke lige umiddelbart se, hvorfor
dette ikke skulle virker på MySql også.

--
Jesper Stocholm
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Torben Brandt (10-01-2004)
Kommentar
Fra : Torben Brandt


Dato : 10-01-04 23:08

Jesper Stocholm skrev:
> Magnus wrote :
>
>>SQL = "SELECT * FROM Afstemning ORDER BY dato DESC GROUP BY kategori"
>
> Det er lavet på MSSQL, men jeg kan ikke lige umiddelbart se, hvorfor
> dette ikke skulle virker på MySql også.

Jeg tror, det Magnus har, er en række kategorier og i hver kategori er
der en række poster:
id kategori dato
1 1 01-01-2004
2 1 10-01-2004
3 2 08-01-2004
4 2 02-01-2004
Han vil så udtage posterne med id 2 og 3, idet han vil have én post fra
hver kategori, og den post, der skal returneres er den (indenfor
kategorien), der har den højeste dato.

Noget i denne stil:
SELECT * FROM Afstemninger
WHERE (dato, kategori) IN
(SELECT Max(dato), kategori FROM Afstemninger GROUP BY kategori)

NB Jeg aner ikke om dette kan køres, men uanset hvad, så er sub selects
kun i alpha-versionen for MySQL...

Jeg kan desværre ikke svare på Magnus' spørgsmål, men vil gerne høre
svaret

/Torben


Jesper Stocholm (10-01-2004)
Kommentar
Fra : Jesper Stocholm


Dato : 10-01-04 23:22

Torben Brandt wrote :

> Jesper Stocholm skrev:
>> Magnus wrote :
>>
>>>SQL = "SELECT * FROM Afstemning ORDER BY dato DESC GROUP BY kategori"
>>
>> Det er lavet på MSSQL, men jeg kan ikke lige umiddelbart se, hvorfor
>> dette ikke skulle virker på MySql også.
>
> Jeg tror, det Magnus har, er en række kategorier og i hver kategori er
> der en række poster:
> id kategori dato
> 1 1 01-01-2004
> 2 1 10-01-2004
> 3 2 08-01-2004
> 4 2 02-01-2004
> Han vil så udtage posterne med id 2 og 3, idet han vil have én post fra
> hver kategori, og den post, der skal returneres er den (indenfor
> kategorien), der har den højeste dato.

Det har du nok ret i - jeg kan heller ikke umiddelbart se, hvordan det
skal grejes.



--
Jesper Stocholm
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Torben Brandt (11-01-2004)
Kommentar
Fra : Torben Brandt


Dato : 11-01-04 01:56

Torben Brandt skrev:
> Noget i denne stil:
> SELECT * FROM Afstemninger
> WHERE (dato, kategori) IN
> (SELECT Max(dato), kategori FROM Afstemninger GROUP BY kategori)
>
> NB Jeg aner ikke om dette kan køres, men uanset hvad, så er sub selects
> kun i alpha-versionen for MySQL...

Det kan det godt (i version 4.1.1 alpha)

> Jeg kan desværre ikke svare på Magnus' spørgsmål

Jo, det kunne jeg vist alligvel
SELECT
x.id, x.kategori, x.dato
FROM
Afstemninger x, Afstemninger y
WHERE
x.kategori = y.kategori AND x.dato <= y.dato
GROUP BY
x.id, x.kategori, x.dato
HAVING
COUNT(x.id) = 1

/Torben


Peter Lykkegaard (10-01-2004)
Kommentar
Fra : Peter Lykkegaard


Dato : 10-01-04 23:56

Jesper Stocholm wrote:

> For at kunne lave en group by skal du have en "Aggregate" funktion på
> de øvrigt felter, dvs fx SUM, AVG eller MAX
>
Øhh, nope - desværre ikke helt rigtigt omend man tit bruger group by sammen
med en aggregate funktion
Følgende virker ganske udmærket på mssql

select myfield from mytable group by myfield order by myfield

Svarer til select distinct

select distinct myfield from mytable order by myfield

- Peter



Jens Gyldenkærne Cla~ (11-01-2004)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 11-01-04 00:35

Peter Lykkegaard skrev:

>> For at kunne lave en group by skal du have en "Aggregate"
>> funktion på de øvrigt felter, dvs fx SUM, AVG eller MAX

> Øhh, nope - desværre ikke helt rigtigt omend man tit bruger
> group by sammen med en aggregate funktion

Jeg tror Jesper mener det rigtigt nok - man skal aggregere alle de
felter der ikke indgår i grupperingen.


> Følgende virker ganske udmærket på mssql
>
> select myfield from mytable group by myfield order by myfield

Jep. Følgende er til gengæld ikke muligt:

   SELECT felt1, felt2 FROM tabel GROUP BY felt1

Vil man have felt2 med i postsættet kan man enten gruppere efter
det:

   SELECT felt1, felt2 FROM tabel GROUP BY felt1, felt2

- eller aggregere det:

   SELECT felt1, Max(felt2) FROM tabel GROUP BY felt1
--
Jens Gyldenkærne Clausen
»Diplomatiet består netop i, at de gamle kommatister kan få lov til
at tro, at de har vundet. Men i virkeligheden har de tabt.«
Ole Togeby i Information

Peter Lykkegaard (11-01-2004)
Kommentar
Fra : Peter Lykkegaard


Dato : 11-01-04 09:59

Jens Gyldenkærne Clausen wrote:
>
> Jeg tror Jesper mener det rigtigt nok - man skal aggregere alle de
> felter der ikke indgår i grupperingen.
>
Ok

- Peter



Søg
Reklame
Statistik
Spørgsmål : 177500
Tips : 31968
Nyheder : 719565
Indlæg : 6408509
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste