|
| Finde alle dem som ikke har... Fra : Thomas Lindgaard |
Dato : 22-03-04 18:52 |
|
Hejsa
Hvis nu man har tre tabeller:
person {
id int,
...
}
person_produkt {
person_id int,
produkt_id int
}
produkt {
id int,
...
}
Tabellen person_produkt indeholder (x,y) hvis person x har købt produkt
y.
Kan man vha. een forespørgsel finde alle de produkter som x _ikke_ har
købt? (MySQL version < 4, dvs. ingen sub-selects) - altså kan man
oversætte følgende forespørgsel til noget som ikke bruger sub-select?
SELECT id
FROM produkt
WHERE id NOT IN (SELECT product_id
FROM person_produkt
WHERE person_id=x)
(Jeg tror nok at ovenstående SQL klarer opgaven men har af gode grunde
ikke testet det)
Mvh.
/Thomas
| |
Kristian Damm Jensen (23-03-2004)
| Kommentar Fra : Kristian Damm Jensen |
Dato : 23-03-04 08:15 |
|
Thomas Lindgaard wrote:
> Hejsa
>
> Hvis nu man har tre tabeller:
>
> person {
> id int,
> ...
> }
>
> person_produkt {
> person_id int,
> produkt_id int
> }
>
> produkt {
> id int,
> ...
> }
>
> Tabellen person_produkt indeholder (x,y) hvis person x har købt
> produkt y.
>
> Kan man vha. een forespørgsel finde alle de produkter som x _ikke_ har
> købt? (MySQL version < 4, dvs. ingen sub-selects) - altså kan man
> oversætte følgende forespørgsel til noget som ikke bruger sub-select?
>
> SELECT id
> FROM produkt
> WHERE id NOT IN (SELECT product_id
> FROM person_produkt
> WHERE person_id=x)
>
> (Jeg tror nok at ovenstående SQL klarer opgaven men har af gode grunde
> ikke testet det)
Hvilke gode grunde er det? Det kan da ikke tage mere end 5 minutter at lave
et testscript, der opretter tabeller, indsætter relevante data, udfører
forespørgslen og nedlægger tabellerne igen.
(Det virker, så vidt jeg kan se.)
Det kan også skrives som
SELECT id
FROM produkt
WHERE NOT EXISTS (SELECT *
FROM person_produkt
WHERE person_id=x
AND produkt.id = person_produkt.id)
--
Kristian Damm Jensen damm (at) ofir (dot) dk
If you can't be bothered making your message readable, why should I be
bothered reading it?
| |
Thomas Lindgaard (23-03-2004)
| Kommentar Fra : Thomas Lindgaard |
Dato : 23-03-04 10:12 |
|
"Kristian Damm Jensen" <REdammMOVE@ofir.dk> wrote in
news:c3oo70$2ai1nd$1@ID-146708.news.uni-berlin.de:
> Hvilke gode grunde er det? Det kan da ikke tage mere end 5 minutter at
> lave et testscript, der opretter tabeller, inds‘tter relevante data,
> udf›rer foresp›rgslen og nedl‘gger tabellerne igen.
>
De gode grunde er at jeg ikke har en database-server der understøtter sub-
selects...
/Thomas
| |
Kristian Damm Jensen (23-03-2004)
| Kommentar Fra : Kristian Damm Jensen |
Dato : 23-03-04 10:28 |
|
Thomas Lindgaard wrote:
> "Kristian Damm Jensen" <REdammMOVE@ofir.dk> wrote in
> news:c3oo70$2ai1nd$1@ID-146708.news.uni-berlin.de:
>
>> Hvilke gode grunde er det? Det kan da ikke tage mere end 5 minutter
>> at lave et testscript, der opretter tabeller, inds'tter relevante
>> data, udf>rer foresp>rgslen og nedl'gger tabellerne igen.
>>
>
> De gode grunde er at jeg ikke har en database-server der understøtter
> sub- selects...
Sorry, det overså jeg.
Standardteknikken til implementering af not exist forespørgsler i MySQL er
at bruge outer join.
select *
from t1
where not exists (select * from t2 where t1.id = t2.id)
er ækvivalent til
select t1.*
from t1 outer join t2 on t1.id = t2.id
where ts.id is NULL
--
Kristian Damm Jensen damm (at) ofir (dot) dk
I disagree with what you say, but I will defend to the death your right
to say it. -- Voltaire
| |
Thomas Lindgaard (24-03-2004)
| Kommentar Fra : Thomas Lindgaard |
Dato : 24-03-04 21:06 |
|
On Tue, 23 Mar 2004 10:28:20 +0100, Kristian Damm Jensen wrote:
>
> select t1.*
> from t1 outer join t2 on t1.id = t2.id
> where ts.id is NULL
Jeg takker og bukker og vil prøve det ved førstkommende lejlighed :)
Mvh.
/Thomas
| |
|
|