/ 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
MySQl + distinct
Fra : Kim Emax


Dato : 28-09-09 04:04

Hey gruppe.

Jeg har en underlig ting, jeg vil dele med Jer. Ved en select
distinct, der kigges der da kun på det felt, man selecter distinct,
ikke? Sådan syns jeg altid MySQL har opført sig overfor mig, men idag
har jeg oplevet den mærkelige ting at den kiggede efter unikke
resultater i stedet, ikke unikke felter, se nedenstående.

mysql> select DISTINCT track_id from downloads d, versions v where
member_id = 1 and v.version_id = d.version_id order by track_id desc
limit 10;
+----------+
| track_id |
+----------+
| 348 |
| 343 |
| 339 |
| 338 |
| 337 |
| 336 |
| 335 |
| 334 |
| 333 |
| 332 |
+----------+
10 rows in set (0.03 sec)

Kun en 333 her, men selecter jeg feltet "completed" med, så kommer den
to gange:

mysql> select DISTINCT track_id, completed from downloads d, versions
v where member_id = 1 and v.version_id = d.version_id order by
track_id desc limit 10;
+----------+-----------+
| track_id | completed |
+----------+-----------+
| 348 | 1 |
| 343 | 1 |
| 339 | 1 |
| 338 | 1 |
| 337 | 1 |
| 336 | 1 |
| 335 | 1 |
| 334 | 1 |
| 333 | 0 |
| 333 | 1 |
+----------+-----------+
10 rows in set (0.04 sec)

Nu sidder jeg og tænker om jeg alle dage bare har lagt ud med at kun
selecte det felt jeg ville have distinct, for det er første gang i de
over 10 år jeg har arbejdet med MySQL at jeg oplever dette. Anyway,
denne posting er dels som oplysning til andre, der måtte sidde i samme
situation og undre sig og som oplæg til lidt debat/oplysning

--
Mvh
Kim Emax

 
 
Jan Bachman (28-09-2009)
Kommentar
Fra : Jan Bachman


Dato : 28-09-09 18:20

On Mon, 28 Sep 2009 03:04:28 -0700 (PDT), Kim Emax <kimemax@gmail.com>
wrote:

>Jeg har en underlig ting, jeg vil dele med Jer. Ved en select
>distinct, der kigges der da kun på det felt, man selecter distinct,
>ikke? Sådan syns jeg altid MySQL har opført sig overfor mig, men idag
>har jeg oplevet den mærkelige ting at den kiggede efter unikke
>resultater i stedet, ikke unikke felter, se nedenstående.
>Nu sidder jeg og tænker om jeg alle dage bare har lagt ud med at kun
>selecte det felt jeg ville have distinct, for det er første gang i de
>over 10 år jeg har arbejdet med MySQL at jeg oplever dette. Anyway,
>denne posting er dels som oplysning til andre, der måtte sidde i samme
>situation og undre sig og som oplæg til lidt debat/oplysning

Det lyder umiddelbart som om, at du er ude i en "distinct åbenbaring".
I mine mange år med SQL har jeg altid brugt distinct som værende på
hele sættet af valgte felter. Har dog ikke den store erfaring med
MySQL. Men på Oracle/MSSQL fungerer den som du netop har oplevet.

Dvs. select distinct x, y giver unikke poster x, y

F.eks.

data x,y
1,1
1,1
1,2
2,1
2,2
2,1
2,2

select distinct x,y
1,1
1,2
2,1
2,2

select distinct x
1
2

/Jan


Kim Emax (28-09-2009)
Kommentar
Fra : Kim Emax


Dato : 28-09-09 16:20

On Sep 28, 7:20 pm, Jan Bachman <ja...@davs.du> wrote:

> Det lyder umiddelbart som om, at du er ude i en "distinct åbenbaring".

haha, lækkert udtryk

> I mine mange år med SQL har jeg altid brugt distinct som værende på
> hele sættet af valgte felter. Har dog ikke den store erfaring med
> MySQL. Men på Oracle/MSSQL fungerer den som du netop har oplevet.
>
> Dvs. select distinct x, y giver unikke poster x, y

Jo, men det giver jo ingen pointe at man sætter distinct i forbindelse
med et felt, hvis den også kigger på de efterfølgende felter. Ligesom
select count(x), y from x skulle returnere kombinationen af x og y,
ikke kun x. Ok, jeg ved godt at her er tale om en decideret funktion,
men det er en lidt mystisk opførsel af distinct syns jeg. Men netop at
distinct ikke kaldes som en funktion kunne godt indikere at den skal
opføre sig sådan...

--
Mvh
Kim Emax

Lars Kongshøj (29-09-2009)
Kommentar
Fra : Lars Kongshøj


Dato : 29-09-09 12:21

Kim Emax skrev:
> On Sep 28, 7:20 pm, Jan Bachman <ja...@davs.du> wrote:
>
>> Det lyder umiddelbart som om, at du er ude i en "distinct åbenbaring".
>
> haha, lækkert udtryk
>
>> I mine mange år med SQL har jeg altid brugt distinct som værende på
>> hele sættet af valgte felter. Har dog ikke den store erfaring med
>> MySQL. Men på Oracle/MSSQL fungerer den som du netop har oplevet.
>>
>> Dvs. select distinct x, y giver unikke poster x, y
>
> Jo, men det giver jo ingen pointe at man sætter distinct i forbindelse
> med et felt, hvis den også kigger på de efterfølgende felter.

Nej, det er det modsatte der ikke giver mening, hvis du lige
gennemtænker det - for så ville man jo bare få en tilfældig record i det
tilfælde, at et enkelt felt havde en duplikatværdi.

/Lars

Arne Vajhøj (29-09-2009)
Kommentar
Fra : Arne Vajhøj


Dato : 29-09-09 02:52

Kim Emax wrote:
> Hey gruppe.
>
> Jeg har en underlig ting, jeg vil dele med Jer. Ved en select
> distinct, der kigges der da kun på det felt, man selecter distinct,
> ikke? Sådan syns jeg altid MySQL har opført sig overfor mig, men idag
> har jeg oplevet den mærkelige ting at den kiggede efter unikke
> resultater i stedet, ikke unikke felter, se nedenstående.
>
> mysql> select DISTINCT track_id from downloads d, versions v where
> member_id = 1 and v.version_id = d.version_id order by track_id desc
> limit 10;
> +----------+
> | track_id |
> +----------+
> | 348 |
> | 343 |
> | 339 |
> | 338 |
> | 337 |
> | 336 |
> | 335 |
> | 334 |
> | 333 |
> | 332 |
> +----------+
> 10 rows in set (0.03 sec)
>
> Kun en 333 her, men selecter jeg feltet "completed" med, så kommer den
> to gange:
>
> mysql> select DISTINCT track_id, completed from downloads d, versions
> v where member_id = 1 and v.version_id = d.version_id order by
> track_id desc limit 10;
> +----------+-----------+
> | track_id | completed |
> +----------+-----------+
> | 348 | 1 |
> | 343 | 1 |
> | 339 | 1 |
> | 338 | 1 |
> | 337 | 1 |
> | 336 | 1 |
> | 335 | 1 |
> | 334 | 1 |
> | 333 | 0 |
> | 333 | 1 |
> +----------+-----------+
> 10 rows in set (0.04 sec)
>
> Nu sidder jeg og tænker om jeg alle dage bare har lagt ud med at kun
> selecte det felt jeg ville have distinct, for det er første gang i de
> over 10 år jeg har arbejdet med MySQL at jeg oplever dette. Anyway,
> denne posting er dels som oplysning til andre, der måtte sidde i samme
> situation og undre sig og som oplæg til lidt debat/oplysning

MySQL har jo ikke nogen mulighed for at gætte hvilken af de
to 333'ere du vil se, så den viser naturligvis begge.

SELECT track_id,MAX(completed)
....
GROUP BY track_id

eller

SELECT track_id,MIN(completed)
....
GROUP BY track_id


vil vælge en af dem.

(i MySQL vil ingen GROUP BY også vælge en tilfældig af dem, men
i andre SQL dialekter vil du få en fejl)

Arne

N/A (29-09-2009)
Kommentar
Fra : N/A


Dato : 29-09-09 12:21



Kim Emax (29-09-2009)
Kommentar
Fra : Kim Emax


Dato : 29-09-09 14:21

On Sep 29, 1:20 pm, Lars Kongshøj <lars_kongs...@hotmail.com> wrote:

> Nej, det er det modsatte der ikke giver mening, hvis du lige
> gennemtænker det - for så ville man jo bare få en tilfældig record i det
> tilfælde, at et enkelt felt havde en duplikatværdi.

Som jeg skrev tidligere, det afhænger lidt af måden man læser det på.
Count() er en funktion, så der giver det go mening at det naturligvis
kun er feltet, der countes på, der returneres. Med distinct er det
ikke en funktion, så der kigger den nok på alle felter, der trækkes ud
og laver en unik der. Jeg har bare altid læst det som distinct FELT,
så er det kun FELT, der vises unikt. Jeg har så nok altid kun hentet
eet felt ud siden jeg først støder på problematikken nu.

--
Mvh
Kim Emax

Kaj Julius (30-09-2009)
Kommentar
Fra : Kaj Julius


Dato : 30-09-09 09:14

>Som jeg skrev tidligere, det afhænger lidt af måden man læser det på.
>Count() er en funktion, så der giver det go mening at det naturligvis
>kun er feltet, der countes på, der returneres. Med distinct er det
>ikke en funktion, så der kigger den nok på alle felter, der trækkes ud
>og laver en unik der. Jeg har bare altid læst det som distinct FELT,
>så er det kun FELT, der vises unikt. Jeg har så nok altid kun hentet
>eet felt ud siden jeg først støder på problematikken nu.
>
>--
>Mvh
>Kim Emax

Count() er en funktion, hvor du placerer feltnavnet i en parantes, mens
Distinct er en instruktion eller måske snarere en modifier til instruktionen
Select, som angiver, at det Select returnerer, skal være unikke rækker og
gælder altså alle de udvalgte felter.

Måske har du forvekslet det med, at Count() funktionen også har en modifier,
som giver mulighed for kun at tælle unikke værdier? Count(*) tæller rækker,
Count(feltnavn) tæller antal rækker, hvor feltet ikke er null og
Count(Distinct feltnavn) tæller unikke værdier af feltet.




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

Månedens bedste
Årets bedste
Sidste års bedste