|
| problemer med DISTINCT i mysql 4,1 Fra : Morten Dall |
Dato : 29-09-04 21:44 |
|
hej alle jer er stødt på et problem der har forstyret min natte søven i
mange dage nu
jeg har en tur tabel, men nogle ture i i denne tabel er der et link_id via
dette kan man fortælle at at 2 eller flere ture høre sammen (de har samme
link_id)
når man så skal oprette en ny tur og vil linke den sammen med en
eksisterende tur, skal der være en dropdown box hvor man kan vælge en tur at
linke med, men den bliver meget lang, så for at begranse den leger jeg med
DISTINCT men uden hel.
f.eks.
tabellen ser sådanne ud
link_id - beskrivelse - dato
----------------------------
1 skov tur 12/07
1 båd tur 15/08
2 ud i det blå 06/10
3 by tur 17/09
hvis jeg laver en "select distinct link_id from tur"
får jeg
1
2
3
som forvendter
men det jeg gerne vil have er
1 skov tur 12/07
2 ud i det blå 06/10
3 by tur 17/09
jeg har i mit hovede leget med sub select, joint, limit osv osv, men jeg kan
ikke få skruget noget sammen der virker er der en af jer der kan hjælpe ????
mvh Morten Dall Darmer
| |
Peter Brodersen (30-09-2004)
| Kommentar Fra : Peter Brodersen |
Dato : 30-09-04 01:01 |
|
On Wed, 29 Sep 2004 22:43:42 +0200, "Morten Dall"
<mrdall@knus.dk-slet-alt-efter-dk> wrote:
>når man så skal oprette en ny tur og vil linke den sammen med en
>eksisterende tur, skal der være en dropdown box hvor man kan vælge en tur at
>linke med, men den bliver meget lang, så for at begranse den leger jeg med
>DISTINCT men uden hel.
DISTINCT er bare en anden måde at skrive GROUP BY på, med samtlige
angivede felter.
Så ved fx "SELECT DISTINCT link_id, beskrivelse, dato .." knytter
DISTINCT sig ikke til link_id, men til alle tre felter. Tilsvarende
giver følgende slet og ret heller ikke nogen mening (men derimod en
fejl):
SELECT link_id, DISTINCT beskrivelse, dato ..
>men det jeg gerne vil have er
>1 skov tur 12/07
>2 ud i det blå 06/10
>3 by tur 17/09
>
>jeg har i mit hovede leget med sub select, joint, limit osv osv, men jeg kan
>ikke få skruget noget sammen der virker er der en af jer der kan hjælpe ????
Du skal blot lave en GROUP BY, kun på link_id. Det er også, hvad der
sker i din "select distinct link_id from tur". Så:
SELECT link_id, beskrivelse, dato FROM tur GROUP BY link_id
MySQL sorterer sandsynligvis i forvejen link_id i forbindelse med den
GROUP BY, men for en god ordens skyld kan du altid smide en ORDER BY
på.
--
- Peter Brodersen
Ugens sprogtip: professionel (og ikke proffessionel)
| |
Peter Brodersen (30-09-2004)
| Kommentar Fra : Peter Brodersen |
Dato : 30-09-04 02:23 |
|
On Thu, 30 Sep 2004 02:01:10 +0200, Peter Brodersen <usenet@ter.dk>
wrote:
>DISTINCT er bare en anden måde at skrive GROUP BY på, med samtlige
>angivede felter.
(det er så lidt af en tilsnigelse - men betragt blot verden på den
måde indtil videre, hvis det hjælper)
--
- Peter Brodersen
Ugens sprogtip: professionel (og ikke proffessionel)
| |
Kristian Damm Jensen (30-09-2004)
| Kommentar Fra : Kristian Damm Jensen |
Dato : 30-09-04 12:14 |
|
Peter Brodersen <usenet@ter.dk> wrote in message news:<cjfic6$23n$1@katie.ellegaard.dk>...
<snip>
> Du skal blot lave en GROUP BY, kun på link_id. Det er også, hvad der
> sker i din "select distinct link_id from tur". Så:
>
> SELECT link_id, beskrivelse, dato FROM tur GROUP BY link_id
Det kan godt være, at det virker i MySQL (det ved du sikkert bedre end
mig), men det er giftigt, og ikke i overenstemmelse med standarden.
Efter standarden skal alle elementer i select, der ikke indgår i en
aggregeringsfunktion, også fremgå af group by. Er det ikke tilfældet,
er resultatet udefineret.
Sidst jeg kom til at lave noget lignende i Sybase fik jeg smidt
ubehageligt store datamængder i hovedet.
VH
Kristian
| |
Peter Brodersen (01-10-2004)
| Kommentar Fra : Peter Brodersen |
Dato : 01-10-04 00:10 |
|
On 30 Sep 2004 04:13:32 -0700, damm@ofir.dk (Kristian Damm Jensen)
wrote:
>Det kan godt være, at det virker i MySQL (det ved du sikkert bedre end
>mig), men det er giftigt, og ikke i overenstemmelse med standarden.
>Efter standarden skal alle elementer i select, der ikke indgår i en
>aggregeringsfunktion, også fremgå af group by. Er det ikke tilfældet,
>er resultatet udefineret.
Det er helt rigtigt, at det kan være et vilkårligt resultat - altså,
en vilkårlig værdi af de aggregerede felter, der præsenteres. MySQL
har det fint med det. Man kan evt. kombinere det med MIN() eller
MAX(), hvilket dog bare kan være lige så grimt og vilkårligt i forhold
til et tekstfelt.
I det aktuelle tilfælde lader det dog ikke til at være vigtigt (men
det er nok mere et spørgsmål om datamodel). En anden mulighed for
Morten er at bruge MySQL 4.1-funktionen GROUP_CONCAT(), hvis han vil
have begge resultater vist, men på samme række i samme felt i
resultatsættet.
--
- Peter Brodersen
Ugens sprogtip: professionel (og ikke proffessionel)
| |
Morten Dall (30-09-2004)
| Kommentar Fra : Morten Dall |
Dato : 30-09-04 18:11 |
|
"Peter Brodersen" <usenet@ter.dk> skrev i en meddelelse
news:cjfic6$23n$1@katie.ellegaard.dk...
> On Wed, 29 Sep 2004 22:43:42 +0200, "Morten Dall"
> SELECT link_id, beskrivelse, dato FROM tur GROUP BY link_id
hej Peter,
UTROLIGT, UTROLIGT, det er så simpelt at jeg ikke har prøvet det, og da jeg
læste det var jeg lige ved at skrive til dig, som en anden også har gjort,
"det vil ikke virke" MEN så tænkte jeg prøver det lige inde jeg skriver, OG
JO DET VIRKET,
MANGE, MANGE, MANGE, TAK
mvh Morten Dall Darmer.
| |
Kristian Damm Jensen (30-09-2004)
| Kommentar Fra : Kristian Damm Jensen |
Dato : 30-09-04 12:10 |
|
"Morten Dall" <mrdall@knus.dk-slet-alt-efter-dk> wrote in message news:<415b1e82$0$155$edfadb0f@dread11.news.tele.dk>...
> hej alle jer er stødt på et problem der har forstyret min natte søven i
> mange dage nu
>
> jeg har en tur tabel, men nogle ture i i denne tabel er der et link_id via
> dette kan man fortælle at at 2 eller flere ture høre sammen (de har samme
> link_id)
> når man så skal oprette en ny tur og vil linke den sammen med en
> eksisterende tur, skal der være en dropdown box hvor man kan vælge en tur at
> linke med, men den bliver meget lang, så for at begranse den leger jeg med
> DISTINCT men uden hel.
>
> f.eks.
>
> tabellen ser sådanne ud
>
> link_id - beskrivelse - dato
> ----------------------------
> 1 skov tur 12/07
> 1 båd tur 15/08
> 2 ud i det blå 06/10
> 3 by tur 17/09
>
> hvis jeg laver en "select distinct link_id from tur"
> får jeg
> 1
> 2
> 3
> som forvendter
>
> men det jeg gerne vil have er
> 1 skov tur 12/07
> 2 ud i det blå 06/10
> 3 by tur 17/09
>
> jeg har i mit hovede leget med sub select, joint, limit osv osv, men jeg kan
> ikke få skruget noget sammen der virker er der en af jer der kan hjælpe ????
Muligivs, hvis du kan fortælle, hvorfor du vil have "1 skov tur
12/07" fremfor "1 båd tur 15/08".
VH
Kristian
| |
Morten Dall (30-09-2004)
| Kommentar Fra : Morten Dall |
Dato : 30-09-04 18:04 |
|
"Kristian Damm Jensen" <damm@ofir.dk> skrev i en meddelelse
news:2c9e2992.0409300309.51f19c39@posting.google.com...
>> men det jeg gerne vil have er
>> 1 skov tur 12/07
>> 2 ud i det blå 06/10
>> 3 by tur 17/09
>>
>> jeg har i mit hovede leget med sub select, joint, limit osv osv, men jeg
>> kan
>> ikke få skruget noget sammen der virker er der en af jer der kan hjælpe
>> ????
>
> Muligivs, hvis du kan fortælle, hvorfor du vil have "1 skov tur
> 12/07" fremfor "1 båd tur 15/08".
hej Kristian,
jeg er lige glad med om jeg får "1 skov tur 12/07" eller "1 båd tur
15/08"
jeg vil bare KUN have en af dem, for at begranse listens længde, for har der
er ved at oprette en tur som han vil linke til de 2 ture, har lige oprettet
de to andre, så han skal bare kunne vælge en af dem.
mvh Morten Dall
| |
Kristian Damm Jensen (01-10-2004)
| Kommentar Fra : Kristian Damm Jensen |
Dato : 01-10-04 12:00 |
|
"Morten Dall" <mrdall@knus.dk-slet-alt-efter-dk> wrote in message news:<415c3c90$0$211$edfadb0f@dread11.news.tele.dk>...
> "Kristian Damm Jensen" <damm@ofir.dk> skrev i en meddelelse
> news:2c9e2992.0409300309.51f19c39@posting.google.com...
> >> men det jeg gerne vil have er
> >> 1 skov tur 12/07
> >> 2 ud i det blå 06/10
> >> 3 by tur 17/09
> >>
> >> jeg har i mit hovede leget med sub select, joint, limit osv osv, men jeg
> >> kan
> >> ikke få skruget noget sammen der virker er der en af jer der kan hjælpe
> >> ????
> >
> > Muligivs, hvis du kan fortælle, hvorfor du vil have "1 skov tur
> > 12/07" fremfor "1 båd tur 15/08".
>
> hej Kristian,
>
> jeg er lige glad med om jeg får "1 skov tur 12/07" eller "1 båd tur
> 15/08"
> jeg vil bare KUN have en af dem, for at begranse listens længde, for har der
> er ved at oprette en tur som han vil linke til de 2 ture, har lige oprettet
> de to andre, så han skal bare kunne vælge en af dem.
Nu har Peter leveret en løsning, der øjensynlig virker i MySQL, men
eftersom jeg har kritiseret den for at ikke at være standard, skylder
jeg vel at levere en standardløsning.
select T.link_id, T.beskrivelse, T.dato
from T
join
(select link_id, min(dato) min_dato
from T
group by link_id) T2
on T.link_id = T2.link_id
and T.dato = T2.min_dato
VH
Kristian
>
> mvh Morten Dall
| |
|
|