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