harald_ Skrevet 10. juni 2008 Del Skrevet 10. juni 2008 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
blackbrrd Skrevet 10. juni 2008 Del Skrevet 10. juni 2008 SELECT * FROM brukere INNER JOIN aktiviterer WHERE aktiviter NOT EXISTS (SELECT 1 FROM brukeraktiviteter WHERE aktiviteter = id_aktiviteter AND brukere = id_brukere) Lenke til kommentar
kaffenils Skrevet 11. juni 2008 Del Skrevet 11. juni 2008 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 Lenke til kommentar
roac Skrevet 11. juni 2008 Del Skrevet 11. juni 2008 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
kaffenils Skrevet 11. juni 2008 Del Skrevet 11. juni 2008 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 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
harald_ Skrevet 12. juni 2008 Forfatter Del Skrevet 12. juni 2008 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
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå