|
| group by og order by i samme select. Fra : Ulrik Nielsen |
Dato : 24-10-04 18:19 |
|
Hej NG,
Jeg har et problem med at få sorteret nogle data.
min select ser således ud:
SELECT
s.id,
s.domain,
l.date
FROM
psm_sites AS s,
psm_log AS l
WHERE
s.id = l.site_id
GROUP BY
domain
ORDER BY
date DESC
Den finder fint de rigtigt data, men de er sorteret efter doamin og ikke
som det var meningen efter date...
Jeg bruger MySQL.
Håber der er nogen der har en ide til hvad der kan gøres.
på forhånd tak
--
ulrik nielsen |
-----------------+---------------------------------------------------
quote or the day | You need to install an RTFM interface.
from bofh | http://www.cs.wisc.edu/~ballard/bofh/
| |
Kristian Damm Jensen (25-10-2004)
| Kommentar Fra : Kristian Damm Jensen |
Dato : 25-10-04 08:31 |
|
Ulrik Nielsen <un.spam@tiscali.dk> wrote in message news:<417be3fe$0$249$edfadb0f@dread12.news.tele.dk>...
> Hej NG,
>
> Jeg har et problem med at få sorteret nogle data.
> min select ser således ud:
>
> SELECT
> s.id,
> s.domain,
> l.date
> FROM
> psm_sites AS s,
> psm_log AS l
> WHERE
> s.id = l.site_id
> GROUP BY
> domain
> ORDER BY
> date DESC
>
> Den finder fint de rigtigt data, men de er sorteret efter doamin og ikke
> som det var meningen efter date...
>
> Jeg bruger MySQL.
>
> Håber der er nogen der har en ide til hvad der kan gøres.
Umiddelbart virker det som en klokkeren fejl.
Men det kan godt undre mig, hvorfor du overhovedet laver en group by,
når du ikke anvender nogen aggregeringsfunktion. Det kan være med til
at forvirre MySQL.
VH
Kristian
| |
Michael Foged (25-10-2004)
| Kommentar Fra : Michael Foged |
Dato : 25-10-04 10:01 |
|
On Mon, 25 Oct 2004 00:31:17 -0700, Kristian Damm Jensen wrote:
> når du ikke anvender nogen aggregeringsfunktion
Og dette fik mig til at flyve i google, uden jeg dog blev spor klogere.
Vil du _kort_ forklare hvad du mener med en aggregeringsfunktion?
--
mvh
Michael Foged
| |
Jens Gyldenkærne Cla~ (25-10-2004)
| Kommentar Fra : Jens Gyldenkærne Cla~ |
Dato : 25-10-04 10:53 |
|
Michael Foged skrev:
> Vil du _kort_ forklare hvad du mener med en aggregeringsfunktion?
Jeg hopper lige ind. Aggregeringsfunktioner er funktioner der virker på
sæt af data i stedet for på enkelte poster. Det er fx COUNT, MIN, MAX,
AVG og SUM. Når man anvender aggregeringsfunktioner, skal alle felter i
select-listen enten være aggregerede (altså "omsluttet" af en
aggregeringsfunktion) eller være medtaget i et grupperingsudtryk.
Et par eksempler:
/* Tæl alle poster i tabellen */
SELECT COUNT(*) as antal FROM tabel
/* Tæl antal poster pr postnr */
SELECT postnr, COUNT(*) as antal FROM tabel GROUP BY postnr
/* Find mindste og højeste pris pr. varegruppe */
SELECT varegruppe, MIN(pris) as minpris, MAX(pris) as maxpris
FROM varer
GROUP BY varegruppe
Ugyldige eksempler (i begge tilfælde er problemet at der er felter der
hverken er aggregerede eller grupperede)
SELECT *, COUNT(*) as antal FROM tabel
SELECT felt1, felt2, COUNT(*) as antal
FROM tabel
GROUP BY felt1
--
Jens Gyldenkærne Clausen
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
| |
Michael Foged (25-10-2004)
| Kommentar Fra : Michael Foged |
Dato : 25-10-04 11:26 |
|
On Mon, 25 Oct 2004 11:53:29 +0200, Jens Gyldenkærne Clausen wrote:
> Michael Foged skrev:
>
>> Vil du _kort_ forklare hvad du mener med en aggregeringsfunktion?
>
> Jeg hopper lige ind.
<snip en glimrende forklaring>
Tak for en god forklaring, så faldt der endnu en 10-øre på plads:)
--
mvh
Michael Foged
| |
Kristian Damm Jensen (26-10-2004)
| Kommentar Fra : Kristian Damm Jensen |
Dato : 26-10-04 08:17 |
|
Michael Foged <spamme@mogif.de> wrote in message news:<pan.2004.10.25.09.00.47.871671@mogif.de>...
> On Mon, 25 Oct 2004 00:31:17 -0700, Kristian Damm Jensen wrote:
>
> > når du ikke anvender nogen aggregeringsfunktion
>
> Og dette fik mig til at flyve i google, uden jeg dog blev spor klogere.
>
> Vil du _kort_ forklare hvad du mener med en aggregeringsfunktion?
Nu har Jens skrevet en glilmrende forklaring, så den vil jeg ikke
uddybe.
Men en søgning på "aggregate function" i fx MySQLs on-line manual
ville sikkert give en del hit. Jeg oversatte bare ordet til dansk -
efter bedste evne.
Kristian
| |
Michael Foged (26-10-2004)
| Kommentar Fra : Michael Foged |
Dato : 26-10-04 09:22 |
|
On Tue, 26 Oct 2004 00:17:08 -0700, Kristian Damm Jensen wrote:
> Michael Foged <spamme@mogif.de> wrote in message
> news:<pan.2004.10.25.09.00.47.871671@mogif.de>...
>> On Mon, 25 Oct 2004 00:31:17 -0700, Kristian Damm Jensen wrote:
>>
>> > når du ikke anvender nogen aggregeringsfunktion
>>
>> Og dette fik mig til at flyve i google, uden jeg dog blev spor klogere.
>>
>> Vil du _kort_ forklare hvad du mener med en aggregeringsfunktion?
>
> Nu har Jens skrevet en glilmrende forklaring, så den vil jeg ikke
> uddybe.
ja, der blev det banket fast.
> Men en søgning på "aggregate function" i fx MySQLs on-line manual
> ville sikkert give en del hit. Jeg oversatte bare ordet til dansk -
> efter bedste evne.
Og jeg kunne ikke finde ud af at oversætte det til engelsk og på den
måde få et fornuftigt søgeresultat.
Men nu ved jeg både hvad det er og hvad det hedder på engelsk, tak for
det!
--
mvh
Michael Foged
| |
Peter Brodersen (25-10-2004)
| Kommentar Fra : Peter Brodersen |
Dato : 25-10-04 16:39 |
|
On 25 Oct 2004 00:31:17 -0700, damm@ofir.dk (Kristian Damm Jensen)
wrote:
>Men det kan godt undre mig, hvorfor du overhovedet laver en group by,
>når du ikke anvender nogen aggregeringsfunktion. Det kan være med til
>at forvirre MySQL.
I MySQLs tilfælde er der vist ingen risiko for forvirring, til trods
for den måske uhensigtsmæssige brug - omend vi har været inde på
brugen af aggregeringsfunktioner før i generel SQL :)
--
- Peter Brodersen
Ugens sprogtip: pc (og ikke PC)
| |
Ulrik Nielsen (26-10-2004)
| Kommentar Fra : Ulrik Nielsen |
Dato : 26-10-04 08:14 |
|
Peter Brodersen wrote:
> I MySQLs tilfælde er der vist ingen risiko for forvirring, til trods
> for den måske uhensigtsmæssige brug - omend vi har været inde på
> brugen af aggregeringsfunktioner før i generel SQL :)
det jeg ville opnå ved at gruppere pr domain var at jeg kun fik en
record pr. domain, problemet er bare at den får sorteret efter domain og
ikke efter den dato som jeg har i min "order by"...
--
ulrik nielsen |
-----------------+---------------------------------------------------
quote or the day | Firmware update in the coffee machine
from bofh | http://www.cs.wisc.edu/~ballard/bofh/
| |
Kristian Damm Jensen (26-10-2004)
| Kommentar Fra : Kristian Damm Jensen |
Dato : 26-10-04 08:29 |
|
Ulrik Nielsen wrote:
> Peter Brodersen wrote:
> > I MySQLs tilfælde er der vist ingen risiko for forvirring, til
trods
> > for den måske uhensigtsmæssige brug - omend vi har været inde
på
> > brugen af aggregeringsfunktioner før i generel SQL :)
>
> det jeg ville opnå ved at gruppere pr domain var at jeg kun fik en
> record pr. domain, problemet er bare at den får sorteret efter
domain og
> ikke efter den dato som jeg har i min "order by"...
Selv om Peter hævder, at det ikke skulle betyde noget, så giver det
mig alligevel myrekryb at se group by anvendt på denne måde. Prøv at
indsætte aggregeringsfunktioner således (i det jeg går ud fra, at er
ligeglad med hvilken af de mulige værdier for id og date du får for
et givet domain)
SELECT
MAX(s.id),
s.domain,
MAX(l.date) AS MAX_DATE
FROM
psm_sites AS s,
psm_log AS l
WHERE
s.id = l.site_id
GROUP BY
domain
ORDER BY
MAX_DATE DESC
VH
Kristian
| |
rpje (26-10-2004)
| Kommentar Fra : rpje |
Dato : 26-10-04 08:50 |
|
"Ulrik Nielsen" skrev d. 24-10-04 18:19 dette indlæg :
> Hej NG,
>
> Jeg har et problem med at få sorteret nogle data.
> min select ser således ud:
>
> SELECT
> s.id,
> s.domain,
> l.date
> FROM
> psm_sites AS s,
> psm_log AS l
> WHERE
> s.id = l.site_id
> GROUP BY
> domain
> ORDER BY
> date DESC
>
> Den finder fint de rigtigt data, men de er sorteret efter doamin og
ikke
> som det var meningen efter date...
>
> Jeg bruger MySQL.
>
> Håber der er nogen der har en ide til hvad der kan gøres.
>
> på forhånd tak
> --
> ulrik nielsen |
> -----------------+---------------------------------------------------
> quote or the day | You need to install an RTFM interface.
> from bofh | http://www.cs.wisc.edu/~ballard/bofh/
Det giver ingen mening at benytte order by sammen med group by
En Group by udgave
SELECT
s.id,
s.domain,
l.date
FROM
psm_sites AS s,
psm_log AS l
WHERE
s.id = l.site_id
GROUP BY
l.date, s.domain, s.id
Først sorteres der efter date så domain til sidst id
En Order by udgave
SELECT
s.id,
s.domain,
l.date
FROM
psm_sites AS s,
psm_log AS l
WHERE
s.id = l.site_id
ORDER BY
l.date, s.domain, s.id
Først sorteres der efter date så domain til sidst id
MV.
Peter Jensen
--
Leveret af:
http://www.kandu.dk/
"Vejen til en hurtig løsning"
| |
Jens Gyldenkærne Cla~ (26-10-2004)
| Kommentar Fra : Jens Gyldenkærne Cla~ |
Dato : 26-10-04 11:20 |
|
rpje skrev:
> Det giver ingen mening at benytte order by sammen med group by
Det gør det da i høj grad. Group by indebærer gruppering, men ikke
nødvendigvis sortering.
Jeg kender ikke til mysql, men i MSSQL er der fx forskel på følgende to
resultatsæt:
select afdeling, count(*)
from dmf_xls
group by afdeling
select afdeling, count(*)
from dmf_xls
group by afdeling
order by afdeling
NB: Du må gerne klippe lidt i dine citater.
--
Jens Gyldenkærne Clausen
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
| |
Kristian Damm Jensen (26-10-2004)
| Kommentar Fra : Kristian Damm Jensen |
Dato : 26-10-04 13:11 |
|
rpje wrote:
<snip>
> Det giver ingen mening at benytte order by sammen med group by
Vås. Group by og order by gør to forskellige ting.
For det første: At de fleste implementation i praksis foretager en
sortering for at kunne lave group by effektivt er et tilfælde. Man kan
ikke regne med det. (Som et andet svar på dit indlæg viser.)
For det andet: Det er ikke sikkert, at man ønsker at sortere på de
samme værdier som man grupperer efter. Det kunne fx være, at man
ville sortere på resultatet af aggregeringen:
select navn, count(*) as antal
from T
group by navn
order by antal
<snip>
Kristian
| |
|
|