/ 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
[MYSQL] Hjælp til joins (tror jeg)
Fra : Kasper Kristensen


Dato : 18-03-04 11:55

Hejsa.

Jeg har brug for hjælp til følgende:

"Titel" tabel:

Titel_id Titel
1 Titel A
2 Titel B
3 Titel C

"Genre" tabel:
genre_id Genre
1 Gyser
2 Komedie
3 Drama

"Lookup" tabel:
Titel_id genre_id
1 1
1 2
2 2

Ovenstående betyder altså at "Titel A" er en Gyser/Komedie og "Titel B" er
en komedie.

Jeg vil gerne udtrække følgende tabel (eller noget tilsvarende hvis i har et
bedre bud):

genre_id Genre Titel_id
1 Gyser 1
2 Komedie 1
3 Drama NULL

og tilsvarende for "Titel B"
genre_id Genre Titel_id
1 Gyser NULL
2 Komedie 1
3 Drama NULL

Mao, jeg vil lave en tabel med samtlige genrer og en kolonne som angiver, om
en given titel tilhører denne genre eller ej.

Jeg tror jeg skal have fat på en "left join" og har prøvet:
"SELECT lookup.titel_id,genre,genre.genre_id from genre left join lookup on
lookup.genre_id=genre.id where titel_id=1 OR titel_id is NULL"

Men dette virker kun lidt efter hensigten. Nogle gode forslag til en query,
eller måske en smartere måde at gøre det på:

Mvh.

Kasper




 
 
Lars Hoffmann (18-03-2004)
Kommentar
Fra : Lars Hoffmann


Dato : 18-03-04 12:13


"Kasper Kristensen" <nospam@nospam.invalid> escribió

> Jeg tror jeg skal have fat på en "left join" og har prøvet:
> "SELECT lookup.titel_id,genre,genre.genre_id from genre left join lookup
on
> lookup.genre_id=genre.id where titel_id=1 OR titel_id is NULL"
Hvad med noget i stil med:

SELECT genre.genre_id, genre.genre, titel.titel
FROM (lookup LEFT JOIN titels ON lookup.titel_id = titel.titel_id) RIGHT
JOIN genres ON lookup.genre_id = genre.genre_id;

Er det det du vil frem til?



Kasper Kristensen (18-03-2004)
Kommentar
Fra : Kasper Kristensen


Dato : 18-03-04 15:24


"Lars Hoffmann" <lars@intercambiodvd.com> wrote in message
news:c3c04j$rnk$1@newsreader.mailgate.org...
>
> "Kasper Kristensen" <nospam@nospam.invalid> escribió
>
> > Jeg tror jeg skal have fat på en "left join" og har prøvet:
> > "SELECT lookup.titel_id,genre,genre.genre_id from genre left join lookup
> on
> > lookup.genre_id=genre.id where titel_id=1 OR titel_id is NULL"
> Hvad med noget i stil med:
>
> SELECT genre.genre_id, genre.genre, titel.titel
> FROM (lookup LEFT JOIN titels ON lookup.titel_id = titel.titel_id) RIGHT
> JOIN genres ON lookup.genre_id = genre.genre_id;
>
> Er det det du vil frem til?
>
>

Nej ikke helt. Med din query får jeg en titel-søjle med en hulens masse
NULL'er og så nogle få rækker med titler og deres genre i næste søjle.

Det jeg ønsker er en tabel som for en given titel (f.els med id=1) har en
søjle med alle genrer og en en søjle som har genren hvis titlen tilhører
denne genre og ellers NULL.

Kasper



Kristian Damm Jensen (18-03-2004)
Kommentar
Fra : Kristian Damm Jensen


Dato : 18-03-04 20:11

Kasper Kristensen wrote:
> Hejsa.
>
> Jeg har brug for hjælp til følgende:
>
> "Titel" tabel:
>
> Titel_id Titel
> 1 Titel A
> 2 Titel B
> 3 Titel C
>
> "Genre" tabel:
> genre_id Genre
> 1 Gyser
> 2 Komedie
> 3 Drama
>
> "Lookup" tabel:
> Titel_id genre_id
> 1 1
> 1 2
> 2 2
>
> Ovenstående betyder altså at "Titel A" er en Gyser/Komedie og "Titel
> B" er en komedie.
>
> Jeg vil gerne udtrække følgende tabel (eller noget tilsvarende hvis i
> har et bedre bud):
>
> genre_id Genre Titel_id
> 1 Gyser 1
> 2 Komedie 1
> 3 Drama NULL
>
> og tilsvarende for "Titel B"
> genre_id Genre Titel_id
> 1 Gyser NULL
> 2 Komedie 1
> 3 Drama NULL
>
> Mao, jeg vil lave en tabel med samtlige genrer og en kolonne som
> angiver, om en given titel tilhører denne genre eller ej.
>
> Jeg tror jeg skal have fat på en "left join" og har prøvet:
> "SELECT lookup.titel_id,genre,genre.genre_id from genre left join
> lookup on lookup.genre_id=genre.id where titel_id=1 OR titel_id is
> NULL"
>
> Men dette virker kun lidt efter hensigten. Nogle gode forslag til en
> query, eller måske en smartere måde at gøre det på:

Det er en fordel, hvis du poster dll og data-indsættelse. Nu har jeg gjort
det for dig. Nedenstående giver det ønskede resultat på Sybase v. 12.5.1.
Jeg giver ingen garantier for MySQL, men jeg kan ikke se, at det burde være
anderledes der.

create table Titel(
Titel_id int
, Titel char(7))
create table Genre(
genre_id int
, Genre char(7))
create table Lookup(
Titel_id int
, genre_id int)
go

insert into Titel values(1, "Titel A")
insert into Titel values(2, "Titel B")
insert into Titel values(3, "Titel C")

insert into Genre values(1, "Gyser")
insert into Genre values(2, "Komedie")
insert into Genre values(3, "Drama")

insert into lookup values(1, 1)
insert into lookup values(1, 2)
insert into lookup values(2, 2)

select * from Titel
select * from genre
select * from lookup

select g.genre_id, genre, l.titel_id
from genre g
left join lookup l
on g.genre_id = l.genre_id
and titel_id = 1
go

drop table titel
drop table genre
drop table lookup
go


--
Kristian Damm Jensen damm (at) ofir (dot) dk
....See their swords? They glow blue in the presence of lawyers. --
Terry Pratchett


Kasper Kristensen (18-03-2004)
Kommentar
Fra : Kasper Kristensen


Dato : 18-03-04 21:38


"Kristian Damm Jensen" <REdammMOVE@ofir.dk> wrote in message
news:c3cs81$264l0t$1@ID-146708.news.uni-berlin.de...
> select g.genre_id, genre, l.titel_id
> from genre g
> left join lookup l
> on g.genre_id = l.genre_id
> and titel_id = 1

You're the man! Tak for hjælpen, det var lige det som skulle til.

Kasper



Kristian Damm Jensen (18-03-2004)
Kommentar
Fra : Kristian Damm Jensen


Dato : 18-03-04 22:10

Kasper Kristensen wrote:
> "Kristian Damm Jensen" <REdammMOVE@ofir.dk> wrote in message
> news:c3cs81$264l0t$1@ID-146708.news.uni-berlin.de...
>> select g.genre_id, genre, l.titel_id
>> from genre g
>> left join lookup l
>> on g.genre_id = l.genre_id
>> and titel_id = 1
>
> You're the man! Tak for hjælpen, det var lige det som skulle til.

I am

Det er vigtigt at forstå forskellen på en betingelse i join-klausulen og i
where-klausulen.


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


Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408925
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste