/ 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
Tricky query (MySQL 5)
Fra : Morten


Dato : 04-08-06 19:29


Hej.

Jeg har en tabel keyval(key int(11), value int(11)). Givet X values, vil
jeg gerne hente alle de keys hvortil der eksisterer en række i tabellen
for mindst hver value.

Altså,

key value
1 8
1 9
1 10
2 8
3 8
3 10
4 8
4 9
4 10
4 11

Givet values 8, 9, 10 skal min query returnere 1 og 4. Antallet af
values er variabelt. Kan det udtrykkes nogenlunde præcist i SQL?

Subqueries med EXISTS virker lidt tungt men illustrerer hvor jeg gerne
vil hen.

SELECT DISTINCT key FROM keyval outer
WHERE EXISTS (SELECT * FROM keyval inner
   WHERE outer.key = inner.key
AND inner.value = 8)
AND EXISTS (SELECT * FROM keyval inner
   WHERE outer.key = inner.key
AND inner.value = 9)
....


Mvh

Morten



 
 
Thorkil Olesen (05-08-2006)
Kommentar
Fra : Thorkil Olesen


Dato : 05-08-06 11:13

Morten <useless@useless.useless> wrote:

> Hej.
>
> Jeg har en tabel keyval(key int(11), value int(11)). Givet X values, vil
> jeg gerne hente alle de keys hvortil der eksisterer en række i tabellen
> for mindst hver value.
>
> Altså,
>
> key value
> 1 8
> 1 9
> 1 10
> 2 8
> 3 8
> 3 10
> 4 8
> 4 9
> 4 10
> 4 11
>
> Givet values 8, 9, 10 skal min query returnere 1 og 4. Antallet af
> values er variabelt. Kan det udtrykkes nogenlunde præcist i SQL?

Hvad med:

select key from keyval where value in (8,9,10) group by key having
count(*) = 3;

Det kræver en unik nøgle (f.eks. en primær nøgle) over (key,value).

(Iøvrigt er 'key' et reserveret ord, så det må ikke bruges i praksis.)

--
Thorkil Olesen,
Hanstholm.

Morten (05-08-2006)
Kommentar
Fra : Morten


Dato : 05-08-06 14:39

Thorkil Olesen wrote:
> Morten <useless@useless.useless> wrote:
>
>> Hej.
>>
>> Jeg har en tabel keyval(key int(11), value int(11)). Givet X values, vil
>> jeg gerne hente alle de keys hvortil der eksisterer en række i tabellen
>> for mindst hver value.
>>
>> Altså,
>>
>> key value
>> 1 8
>> 1 9
>> 1 10
>> 2 8
>> 3 8
>> 3 10
>> 4 8
>> 4 9
>> 4 10
>> 4 11
>>
>> Givet values 8, 9, 10 skal min query returnere 1 og 4. Antallet af
>> values er variabelt. Kan det udtrykkes nogenlunde præcist i SQL?
>
> Hvad med:
>
> select key from keyval where value in (8,9,10) group by key having
> count(*) = 3;
>
> Det kræver en unik nøgle (f.eks. en primær nøgle) over (key,value).
>

Det fungerer Der er en PK(key, value) på den faktiske tabel. For
eksemplets skyld, hvis nu der ikke var en PK - kunne man så stadig
formulere en query der ville virke? (Altså en der kun så på DISTINCT
(key, value) par).

Mvh.

Morten




Michael Zedeler (05-08-2006)
Kommentar
Fra : Michael Zedeler


Dato : 05-08-06 11:33

Morten wrote:
> Jeg har en tabel keyval(key int(11), value int(11)). Givet X values, vil
> jeg gerne hente alle de keys hvortil der eksisterer en række i tabellen
> for mindst hver value.
>
> Altså,
>
> key value
> 1 8
> 1 9
> 1 10
> 2 8
> 3 8
> 3 10
> 4 8
> 4 9
> 4 10
> 4 11
>
> Givet values 8, 9, 10 skal min query returnere 1 og 4.

Det lyder mærkeligt, for der er ingen tuple, der hedder (1,11). Er det
ikke kun 4, den skal returnere?

Mvh. Michael.
--
Which is more dangerous? TV guided missiles or TV guided families?
I am less likely to answer usenet postings by anonymous authors.
Visit my home page at http://michael.zedeler.dk/

Morten (05-08-2006)
Kommentar
Fra : Morten


Dato : 05-08-06 14:34

Michael Zedeler wrote:
> Morten wrote:
>> Jeg har en tabel keyval(key int(11), value int(11)). Givet X values,
>> vil jeg gerne hente alle de keys hvortil der eksisterer en række i
>> tabellen for mindst hver value.
>>
>> Altså,
>>
>> key value
>> 1 8
>> 1 9
>> 1 10
>> 2 8
>> 3 8
>> 3 10
>> 4 8
>> 4 9
>> 4 10
>> 4 11
>>
>> Givet values 8, 9, 10 skal min query returnere 1 og 4.
>
> Det lyder mærkeligt, for der er ingen tuple, der hedder (1,11). Er det
> ikke kun 4, den skal returnere?

Nej - det er kun values 8,9,10 der ledes efter - den skal også virke for
keys for hvilke der er andre records end de angivede. Så hvis det var
8,9,10,11 havde du ret.

Mvh.

Morten


Michael Zedeler (05-08-2006)
Kommentar
Fra : Michael Zedeler


Dato : 05-08-06 14:39

Morten wrote:
> Michael Zedeler wrote:
>
>> Morten wrote:
>>
>>> Jeg har en tabel keyval(key int(11), value int(11)). Givet X values,
>>> vil jeg gerne hente alle de keys hvortil der eksisterer en række i
>>> tabellen for mindst hver value.
>>>
>>> Altså,
>>>
>>> key value
>>> 1 8
>>> 1 9
>>> 1 10
>>> 2 8
>>> 3 8
>>> 3 10
>>> 4 8
>>> 4 9
>>> 4 10
>>> 4 11
>>>
>>> Givet values 8, 9, 10 skal min query returnere 1 og 4.
>>
>> Det lyder mærkeligt, for der er ingen tuple, der hedder (1,11). Er det
>> ikke kun 4, den skal returnere?
>
> Nej - det er kun values 8,9,10 der ledes efter - den skal også virke for
> keys for hvilke der er andre records end de angivede. Så hvis det var
> 8,9,10,11 havde du ret.

Jamen så er Thorkils svar da korrekt?

Mvh. Michael.
--
Which is more dangerous? TV guided missiles or TV guided families?
I am less likely to answer usenet postings by anonymous authors.
Visit my home page at http://michael.zedeler.dk/

Søg
Reklame
Statistik
Spørgsmål : 177580
Tips : 31968
Nyheder : 719565
Indlæg : 6409077
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste