Gå til innhold

Rader fra en tabell som ikke er representert i gitt kombinasjon i en annen tabell


Anbefalte innlegg

Jeg sitter her med tre tabeller: brukere, aktiviteter og brukeraktiviteter

 

Problemet mitt er at jeg gjerne skulle hatt ut alle aktivitetene en bruker ikke har meldt seg på.

 

Løsningen jeg har i dag går ut at jeg først spør om alle aktivitetene, også før hver enkelt skrives ut spør jeg igjen om den aktuelle kombinasjonen finnes - noe som vel er relativt ineffektivt?

 

Dette er en mysql database

 

Må bare beklage for utrolig dårlig topic, klarte ikke formulere det noe bedre...

Lenke til kommentar
Videoannonse
Annonse
select b.*,a.*
from brukere b
cross join aktiviteter a
left join brukeraktiviteter ba on ba.bruker_id=b.bruker_id and ba.aktivitet_id=a.aktivitet_id
where ba.bruker_id is null

Tenkite tanken, men sa den ikke, av en enkelt grunn: Dette bygger opp et potensielt sinnsykt stort recordsett som så filtreres i etterkant. Dette kan gjøre at man får TempDB, og forresten: cross join syntaksen er det vel ikke spesielt mange databasesmotorer som støtter.

Lenke til kommentar
Tenkite tanken, men sa den ikke, av en enkelt grunn: Dette bygger opp et potensielt sinnsykt stort recordsett som så filtreres i etterkant. Dette kan gjøre at man får TempDB, og forresten: cross join syntaksen er det vel ikke spesielt mange databasesmotorer som støtter.

 

Hehe. Jeg vet, og regnet med at du kom til å kommentere det :D

 

Men jeg kommer ikke på andre måter å vise alle aktiviterer som en bruker ikke er medlem av for alle brukere, enn å bruke et kartesisk produkt.

 

Trenger ikke å bruke CROSS JOIN, en INNER JOIN kan også brukes:

 

select b.*,a.*
from brukere b
inner join aktiviteter a on 1=1
left join brukeraktiviteter ba on ba.bruker_id=b.bruker_id and ba.aktivitet_id=a.aktivitet_id
where ba.bruker_id is null

 

Hvis trådstarter derimot ønsker å vise alle aktiviteter en bruker ikke er medlem av for kun én bruker så blir spørringen mye enklere:

 

select a.*
from aktiviteter a
left join brukeraktiviteter ba on ba.bruker_id=12345 and ba.aktivitet_id=a.aktivitet_id
where ba.bruker_id is null

Lenke til kommentar
Hvis trådstarter derimot ønsker å vise alle aktiviteter en bruker ikke er medlem av for kun én bruker så blir spørringen mye enklere:

 

select a.*
from aktiviteter a
left join brukeraktiviteter ba on ba.bruker_id=12345 and ba.aktivitet_id=a.aktivitet_id
where ba.bruker_id is null

Det var akkurat det jeg ville :)

 

Takk for hjelpen folkens!

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...