Kaptein Snus Skrevet 14. mars 2012 Del Skrevet 14. mars 2012 (endret) Heisann! Har databaser som fag på høgskolen dette semesteret og har noen oppgaver som jeg sliter litt med. Jeg har fått følgende tabeller. Freelancer +---------+-----------------+----------------+ | pers_id | fornavn | etternavn | +---------+-----------------+----------------+ | 1001 | Per | Olsen | | 1002 | Anne | Jensen | | 1003 | Jens-Eilert | Grimstad Olsen | | 1004 | Anders | Jespersen | | 1005 | Skandalemakeren | NULL | +---------+-----------------+----------------+ Freelancer_i_avis +---------+-------------------+ | pers_id | avisnavn | +---------+-------------------+ | 1001 | Aftenposten | | 1001 | Dagbladet | | 1001 | Rabarbladet | | 1001 | VG | | 1002 | VG | | 1003 | Dagbladet | | 1003 | VG | | 1004 | Aftenposten | | 1004 | Agderposten | | 1004 | Dagens N?ringsliv | | 1005 | VG | +---------+-------------------+ Freelancer_spesialitet +---------+-------------------------+ | pers_id | spesialitet | +---------+-------------------------+ | 1001 | Politikk | | 1001 | Sport | | 1002 | Sport | | 1003 | Kultur | | 1003 | Politikk | | 1004 | Midt-?sten | | 1004 | ?konomi | | 1005 | Det engelske kongehuset | +---------+-------------------------+ Oppgaven lyder som: # List opp fornavn og etternavn på alle freelancere som ikke jobber i VG Jeg får til å ikke liste opp de radene i freelancer_i_avis som innholder VG, men da får jeg opp flere rader pr person, bare ikke de med VG. mysql> SELECT freelancer.fornavn, freelancer.etternavn, freelancer_i_avis.avisnavn FROM freelancer, freelancer_i_avis WHERE freelancer.pers_id = freelancer_i_avis.pers_id AND freelancer_i_avis.avisnavn <> 'VG'; +-------------+----------------+-------------------+ | fornavn | etternavn | avisnavn | +-------------+----------------+-------------------+ | Per | Olsen | Aftenposten | | Per | Olsen | Dagbladet | | Per | Olsen | Rabarbladet | | Jens-Eilert | Grimstad Olsen | Dagbladet | | Anders | Jespersen | Aftenposten | | Anders | Jespersen | Agderposten | | Anders | Jespersen | Dagens N?ringsliv | +-------------+----------------+-------------------+ Dette blir jo feil i og med at det bare er 1 person som ikke jobber i VG i det hele tatt. Hvordan får jeg luket bort de personene som jobber i VG uten at de dukker opp med de andre avisene de jobber i? Synes det er vanskelig å formulere og jeg vet ikke helt hvor jeg skal begynne å søke hen. Håper dere forstår Endret 14. mars 2012 av Lek1 Lenke til kommentar
laurell Skrevet 14. mars 2012 Del Skrevet 14. mars 2012 Hei Legg til DISTINCT på spørringen din. http://www.w3schools.com/sql/sql_distinct.asp Lenke til kommentar
Kaptein Snus Skrevet 14. mars 2012 Forfatter Del Skrevet 14. mars 2012 Takk for svar! Hvis jeg forstått det riktig så blir det slik: mysql> SELECT DISTINCT freelancer.fornavn, freelancer.etternavn FROM freelancer, freelancer_i_avis WHERE freelancer.pers_id = freelancer_i_avis.pers_id AND freelancer_i_avis.avisnavn <> 'VG'; +-------------+----------------+ | fornavn | etternavn | +-------------+----------------+ | Per | Olsen | | Jens-Eilert | Grimstad Olsen | | Anders | Jespersen | +-------------+----------------+ Men i følge oppgaven så blir dette feil fordi både Per Olsen og Jens-Eilert Grimstad Olsen jobber jo egentlig i VG. Anders Jespersen er den eneste som ikke jobber i VG i det hele tatt. Jeg må på en måte klare å luke bort de personene som har en referenase til VG uansett om de jobber i flere aviser. Håper det ble litt bedre formulert Lenke til kommentar
Alexen Skrevet 14. mars 2012 Del Skrevet 14. mars 2012 Hei! Hvis du nå visste hvem som jobber i VG så er du jo egentlig ute etter ALLE untatt disse. En Subselect med NOT IN kan kanskje hjelpe deg her. SELECT DISTINCT <Alle> WHERE Pers_id NOT IN (Select <Alle_i_vg>) Lenke til kommentar
Kaptein Snus Skrevet 14. mars 2012 Forfatter Del Skrevet 14. mars 2012 Takker for svar! SELECT DISTINCT <Alle> WHERE Pers_id NOT IN (Select <Alle_i_vg>) Menes det her at <Alle> er listen over alle personer (SELECT * FROM freelancer;) eller listen over alle personer med avisnavn: SELECT freelancer.*, freelancer_i_avis.avisnavn FROM freelancer, freelancer_i_avis WHERE freelancer.pers_id = freelancer_i_avis.pers_id; resultat: +---------+-----------------+----------------+-------------------+ | pers_id | fornavn | etternavn | avisnavn | +---------+-----------------+----------------+-------------------+ | 1001 | Per | Olsen | Aftenposten | | 1001 | Per | Olsen | Dagbladet | | 1001 | Per | Olsen | Rabarbladet | | 1001 | Per | Olsen | VG | | 1002 | Anne | Jensen | VG | | 1003 | Jens-Eilert | Grimstad Olsen | Dagbladet | | 1003 | Jens-Eilert | Grimstad Olsen | VG | | 1004 | Anders | Jespersen | Aftenposten | | 1004 | Anders | Jespersen | Agderposten | | 1004 | Anders | Jespersen | Dagens N?ringsliv | | 1005 | Skandalemakeren | NULL | VG | +---------+-----------------+----------------+-------------------+ Jeg har også skrevet spørringen som lister ut alle som jobber i VG: SELECT freelancer.*, freelancer_i_avis.avisnavn FROM freelancer, freelancer_i_avis WHERE freelancer.pers_id = freelancer_i_avis.pers_id AND freelancer_i_avis.avisnavn = 'VG'; resultat: +---------+-----------------+----------------+----------+ | pers_id | fornavn | etternavn | avisnavn | +---------+-----------------+----------------+----------+ | 1001 | Per | Olsen | VG | | 1002 | Anne | Jensen | VG | | 1003 | Jens-Eilert | Grimstad Olsen | VG | | 1005 | Skandalemakeren | NULL | VG | +---------+-----------------+----------------+----------+ I hodet mitt ser det veldig logisk ut, men når jeg skal legge dem sammen og skrive spørringen så får jeg det ikke helt til. Det jeg kom frem til er dette: SELECT DISTINCT freelancer.* FROM freelancer, freelancer_i_avis WHERE freelancer.pers_id NOT IN(SELECT freelancer.* FROM freelancer, freelancer_i_avis WHERE freelancer.pers_id = freelancer_i_avis.pers_id AND freelancer_i_avis.avisnavn = 'VG'); Men da får jeg denne feilmeldingen ERROR 1241 (21000): Operand should contain 1 column(s) Det resultatet jeg er ute etter er vell egentlig +---------+-----------+ | fornavn | etternavn | +---------+-----------+ | Anders | Jespersen | +---------+-----------+ Lenke til kommentar
Kaptein Snus Skrevet 14. mars 2012 Forfatter Del Skrevet 14. mars 2012 Fant ut av det! Måte jeg selvfølgelig returnere freelancer.pers_id fra subqueryen! HALO!^^ Her er spørringen jeg endte med mysql> SELECT DISTINCT freelancer.fornavn, freelancer.etternavn FROM freelancer, freelancer_i_avis WHERE freelancer.pers_id NOT IN(SELECT freelancer.pers_id FROM freelancer, freelancer_i_avis WHERE freelancer.pers_id = freelancer_i_avis.pers_id AND freelancer_i_avis.avisnavn = 'VG'); +---------+-----------+ | fornavn | etternavn | +---------+-----------+ | Anders | Jespersen | +---------+-----------+ Takk til dere som bidro! Lenke til kommentar
Crowly Skrevet 23. mars 2012 Del Skrevet 23. mars 2012 (endret) Ett tips: Det blir mindre å skrive hvis du bruker alias på tabell navnene. Du kan forenkle spørringen til dette SELECT f.fornavn, f.etternavn FROM freelancer f WHERE f.pers_id NOT IN (SELECT a.pers_id FROM freelancer_i_avis a WHERE a.avisnavn='VG') da kjøres sub query'en en gang, i stedet for en gang pr navn Endret 23. mars 2012 av Crowly 1 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å