/ 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
Udvælgelse af nøgler med kun en value
Fra : Anders Wegge Jakobse~


Dato : 15-04-05 12:56


Jeg har en simpel database af typen

Key |Value
---------|--------
k1 |Bar
k1 |Baz
k1 |Bar
k2 |Bar
k2 |Bar
k3 |Foo
k3 |Bar

Og dem er der ca. 1.500.000 af. Nu har jeg så brug for at finde alle
de nøgler, hvor en bestemt værdi er den *eneste* der optræder. I
ovenstående eksempel ville det for eksempel betyde at hvis jeg var
interesserede i alle de nøgler som kun indeholdt Bar som værdi, ville
det være nøglen k2 der skulle komme ud som resultat.

Men hvordan får man lige ordnet det på en snedig måde? Det eneste bud
jeg har, er at lave en optælling på antal nøgler, og sammenligne dem
med antal nøgler med en bestemt værdi, og så kun plukke dem ud hvor
antallet er ens (en bonusopgave er så at finde nøgler med op til 4
bestemte værdier).

Men hvordan gør jeg det? Jeg er ikke så skrap i MySQL og dens
subselect, så jeg kan simpelthen ikke få strikket et query sammen.

--
/Wegge
Min holdning til Usenet - <http://wiki.wegge.dk/Usenet>
Min weblog - <http://blog.wegge.dk/>

 
 
Nikolaj Hansen (15-04-2005)
Kommentar
Fra : Nikolaj Hansen


Dato : 15-04-05 21:36

Anders Wegge Jakobsen wrote:
> Jeg har en simpel database af typen
>
> Key |Value
> ---------|--------
> k1 |Bar
> k1 |Baz
> k1 |Bar
> k2 |Bar
> k2 |Bar
> k3 |Foo
> k3 |Bar

select key from <tabel> where value='bar' group by key;

Måske misforstår jeg noget?

Under alle omstændigheder er den tabel du har en djævel at indeksere
ordentligt.

Hvis din key er ca 50/50 k1 og k2 så giver det faktisk ikke nogen
synderlig hastighedsfremgang at indeksere. Du skal alligevel 50 % af
rækkerne igennem.

Ved mit ovenstående query skal du også have indeks på value.

mvh

Nikolaj

Nikolaj Hansen (15-04-2005)
Kommentar
Fra : Nikolaj Hansen


Dato : 15-04-05 21:45

Nikolaj Hansen wrote:

> select key from <tabel> where value='bar' group by key;

Alternativt

select distinct key from <tabel> where value='bar';

Jeg ved ikke hvad mysql gør hurtigst.

mvh

Nikolaj

Poul-Erik Andreasen (16-04-2005)
Kommentar
Fra : Poul-Erik Andreasen


Dato : 16-04-05 02:18

Nikolaj Hansen wrote:
> Anders Wegge Jakobsen wrote:
>
>> Jeg har en simpel database af typen
>>
>> Key |Value
>> ---------|--------
>> k1 |Bar
>> k1 |Baz
>> k1 |Bar
>> k2 |Bar
>> k2 |Bar
>> k3 |Foo
>> k3 |Bar
>
>
> select key from <tabel> where value='bar' group by key;
>
> Måske misforstår jeg noget?

Det tror jeg; han ved ikke at det er værdie bar han er er interesseret i.

Grunden til at det er den han leder efter er at det er den eneste
der har samme value. k1 har både bar og baz, k3 har både foo og bar,
mens k2 kun har bar

Men du har ret i at indexseringen ikke blier god, noget siger mig
at Anders ikke har en normaliseret database;

Det må blive en eller anden aggregeret function


Poul-Erik


Anders Wegge Jakobse~ (16-04-2005)
Kommentar
Fra : Anders Wegge Jakobse~


Dato : 16-04-05 09:52

"Poul-Erik" == Poul-Erik Andreasen <poulerik@pea.dk> writes:

Jeg svarer lige jer begge her.

> Nikolaj Hansen wrote:
>> Anders Wegge Jakobsen wrote:
>>
>>> Jeg har en simpel database af typen
>>>
>>> Key |Value
>>> ---------|--------
>>> k1 |Bar
>>> k1 |Baz
>>> k1 |Bar
>>> k2 |Bar
>>> k2 |Bar
>>> k3 |Foo
>>> k3 |Bar
>> select key from <tabel> where value='bar' group by key;
>> Måske misforstår jeg noget?

> Det tror jeg; han ved ikke at det er værdie bar han er er
> interesseret i.

Jo, jeg ved at det er bar (og et par andre kendte værdier) jeg er ude
efter.

> Grunden til at det er den han leder efter er at det er den eneste
> der har samme value. k1 har både bar og baz, k3 har både foo og
> bar, mens k2 kun har bar

> Men du har ret i at indexseringen ikke blier god, noget siger mig at
> Anders ikke har en normaliseret database;

Det var en one-off undersøgelse, så det er fuldstændigt korrekt at
databasen ikke er normaliseret i forhold til dette opslag.

> Det må blive en eller anden aggregeret function

Jeg endte med at bruge et par midlertidige tabeller:

insert into tmp1 select (key, count(key)) from tbl where Value = bar
group by key;
insert into tmp2 select (key, count(key)) from tbl group by key;

select tmp1.key from tmp1 inner join tmp2 on tmp1.key = tmp2.key
where tmp1.count = tmp2.count;

Hamrende ineffektivt, men for et enkeltstående tilfældes skyld, kan
jeg godt leve med det.

--
/Wegge
Min holdning til Usenet - <http://wiki.wegge.dk/Usenet>
Min weblog - <http://blog.wegge.dk/>

Lars Hoffmann (16-04-2005)
Kommentar
Fra : Lars Hoffmann


Dato : 16-04-05 10:46

Anders Wegge Jakobsen wrote:
> Jeg har en simpel database af typen
>
> Key |Value
> ---------|--------
> k1 |Bar
> k1 |Baz
> k1 |Bar
> k2 |Bar
> k2 |Bar
> k3 |Foo
> k3 |Bar
>
> Og dem er der ca. 1.500.000 af. Nu har jeg så brug for at finde alle
> de nøgler, hvor en bestemt værdi er den *eneste* der optræder.

Hvad med
SELECT count(*), value, key
FROM table
WHERE count(*)=1
GROUP BY value, key

Anders Wegge Jakobse~ (16-04-2005)
Kommentar
Fra : Anders Wegge Jakobse~


Dato : 16-04-05 11:01

"Lars" == Lars Hoffmann <lars@intercambiodvd.com> writes:

> Anders Wegge Jakobsen wrote:
>> Jeg har en simpel database af typen
>> Key |Value
>> ---------|--------
>> k1 |Bar
>> k1 |Baz
>> k1 |Bar
>> k2 |Bar
>> k2 |Bar
>> k3 |Foo
>> k3 |Bar
>> Og dem er der ca. 1.500.000 af. Nu har jeg så brug for at finde alle
>> de nøgler, hvor en bestemt værdi er den *eneste* der optræder.

> Hvad med
> SELECT count(*), value, key
> FROM table
> WHERE count(*)=1
> GROUP BY value, key

Nej den duer ikke. Det er et unormaliseret udpluk af en større
database, så der er dubletter i.

--
/Wegge
Min holdning til Usenet - <http://wiki.wegge.dk/Usenet>
Min weblog - <http://blog.wegge.dk/>

Søg
Reklame
Statistik
Spørgsmål : 177459
Tips : 31964
Nyheder : 719565
Indlæg : 6408188
Brugere : 218881

Månedens bedste
Årets bedste
Sidste års bedste