Gå til innhold

[Løst] List opp tb1.column1, tb1.column2 hvor tb2.column1 ikke er lik VG


Anbefalte innlegg

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 :p

Endret av Lek1
Lenke til kommentar
Videoannonse
Annonse

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

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

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
  • 2 uker senere...

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 av Crowly
  • Liker 1
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å
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...