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