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

Søg
Reklame
Statistik
Spørgsmål : 177500
Tips : 31968
Nyheder : 719565
Indlæg : 6408509
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste