|
| 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
| |
|
|