/ 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
Join(t) anyone?
Fra : Janus Høi


Dato : 17-02-07 03:15

Jeg har en tabel der hedder 'Person' med følgende felter:

ID | Navn

Der er nogle data i den tabel:
1 | Jens
2 | Hans
3 | Mads


En anden tabel kalder jeg 'status':

Den har felterne:

ID | Titel

Med følgende data:
1 | Rigmandssøn
2 | Greve
3 | Jordbesidder
4 | Tugthusfange


Jeg har så fattet så meget, at der skal være en connecter mellem de to
tabeller.

En tredje tabel kalder jeg så person2status og har givet den felterne:
person_id | status_id

Indholdet ser sådan ud:

1 | 2
1 | 3
2 | 1
3 | 4

(Jens er fyrstelig bondemand, Hans er doven arvtager af fars formue og
Mads er en rigtig skidt knægt)

Nu har jeg prøvet at læse tilbage i gruppen og søge på nettet og jeg-
ved-snart-ikke-hvad. Men jeg har stirretn mig blind på det.

Jeg fandt en tråd med dette forslag:

----- SQL ---

select billede_id from billeder
join optraeder_paa on billeder.billede_id = optraeder_paa.billede_id
join personer on personer.person_id = optraeder_paa.person_id where
personer.fornavn='jens'

------------

Den har jeg så skrevet om mange gange til noget i retning af:

----- SQL ---

SELECT titel FROM status
JOIN telefonliste ON person = person2status.person_id
JOIN person2status ON person_id = person2status.status_id
WHERE person2status.person_id = '2'

------------

I bedste fald sker der ingenting, men i de fleste tilfælde får jeg en
fejlmeddelelse.

Jeg prøver at få det til at fungere ved at køre en SQL-forspørgsel i
PHPMyAdmin, men det vil bare ikke lykkes mig.

Nu smider jeg håndklædet i ringen og erkender, at klokken kvart over
tre kan jeg ikke tænke klart.

--
Janus


 
 
Janus Høi (17-02-2007)
Kommentar
Fra : Janus Høi


Dato : 17-02-07 03:23

Jeg ved ikke om jeg fik det gjort helt klart, men mit ønske er jo, at
man skal kunne søge på person.id og så få at vide at vedkommende er
status.titel..

Altså ID="2" giver outputtet "Tugthusfange"..

--
Janus
Århh.. Hvor er det irriterende, når man stirrer sig blind på noget.


Olav M.J. Christians~ (17-02-2007)
Kommentar
Fra : Olav M.J. Christians~


Dato : 17-02-07 09:54

"Janus Høi" <newsgroup@hjerteknuser.dk> skrev i en meddelelse
news:1171678997.535572.277000@m58g2000cwm.googlegroups.com...
> Jeg ved ikke om jeg fik det gjort helt klart, men mit ønske er jo, at
> man skal kunne søge på person.id og så få at vide at vedkommende er
> status.titel..

Du skal nok lige lave lidt datamodellering først.

Hvilke relationer er der mellem de to tabeller? 1-til-mange, 1-til-1,
mange-til-mange eller mange-til-1?

Her ser det ud som om hver person måske kun kan være én ting? I så fald er
det en 'mange-til-1' relation: Hver person kan kun have én relation til
status, men hver række i status kan forbindes til flere personer. Hvis det
er tilfældet, tilføjer du bare endnu en kolonne til person-tabellen, så du
ud for hver person har et tal der angiver vedkommendes status.

Hvis du nu i stedet vil lave det sådan at der er en mange-til-mange
relation, dvs. at hver person kan have flere status-rækker tilknyttet og
vice versa, så må du (som du er inde på) tilføje en tredje tabel som styrer
relationerne mellem de to.

Inden du kan begynde at konstruere select-statements osv. skal du lige finde
ud af hvilket scenarier du gerne vil have af ovenstående.

M.v.h.
Olav



Janus Høi (17-02-2007)
Kommentar
Fra : Janus Høi


Dato : 17-02-07 11:00

On 17 Feb., 09:54, "Olav M.J. Christiansen"
<omjcingenspam...@jydholm.dk> wrote:

>
> Hvis du nu i stedet vil lave det sådan at der er en mange-til-mange
> relation, dvs. at hver person kan have flere status-rækker tilknyttet og
> vice versa, så må du (som du er inde på) tilføje en tredje tabel som styrer
> relationerne mellem de to.
>
> Inden du kan begynde at konstruere select-statements osv. skal du lige finde
> ud af hvilket scenarier du gerne vil have af ovenstående.
>
> M.v.h.
> Olav

Det er jo netop en mange-til-mange relation.

Det kom måske ikke helt til udtryk i eksemplet, som jeg havde forsøgt
at forenkle.

Eksemplet "Jens" er jo både Greve og Jordbesidder.
Og der skal også være plads til mange Rigmandssønner.
Og hvem ved om nogle af dem også bliver Tugthusfanger en dag.

Jeg troede faktisk, at min tabel "person2status" med felterne
"status_id" og "person_id" var god nok til at styre relationerne
imellem dem.

Ud fra det du skriver, synes jeg at jeg har gjort mig de overvejelser
du nævner.
Har jeg overset noget?

Selve forbindelsen mellem "person" og "status" igennem "person2status"
kan jeg bare ikke finde ud af at formulere.

--
Janus


Olav M.J. Christians~ (17-02-2007)
Kommentar
Fra : Olav M.J. Christians~


Dato : 17-02-07 11:31

"Janus Høi" <newsgroup@hjerteknuser.dk> skrev i en meddelelse
news:1171706423.289703.92290@t69g2000cwt.googlegroups.com...
On 17 Feb., 09:54, "Olav M.J. Christiansen"
<omjcingenspam...@jydholm.dk> wrote:

> Det er jo netop en mange-til-mange relation.

[klip]

Godt, så er det jo nemt nok.

> Jeg troede faktisk, at min tabel "person2status" med felterne
> "status_id" og "person_id" var god nok til at styre relationerne
> imellem dem.

[klip]

Det er den skam også. Det er egentlig ret enkelt. Du skal indsætte en række
i relationstabellen hver gang du ønsker at oprette en relation (en
kombination af person og status).

Hvis du skal udtrække f.eks. alle personer med deres status skal du joine
over alle tre tabeller. M.h.t. syntaks afhænger det lidt af hvilken database
(og version) du bruger. Man kan joine enten ved bare at bruge en
WHERE-statement eller ved at bruge JOIN-operatoren.

F.eks. noget i retning af (ikke afprøvet):

select p.navn, s.titel
from person p, status s, person2status ps
where p.id = ps.person_id and ps.status_id = s.id

Vær dog opmærksom på kartetiske produkter hvis du ikke er sikker på altid at
have relationer. Det kan være en fordel at bruge en LEFT JOIN og starte med
udgangspunkt i tabellen person.

M.v.h.
Olav



Henrik Davidsen (17-02-2007)
Kommentar
Fra : Henrik Davidsen


Dato : 17-02-07 11:30

En mulighed er:

SELECT titel
FROM status, person, person2status
WHERE person.id = person2status.person_id
AND status.id = person2status.status_id
AND person.id = '2'



Det kan også skrives med JOIN som du var inde på:
SELECT titel FROM status
JOIN person2status ON status.id = person2status.status_id
JOIN person ON person.id = person2status.person_id
WHERE person2status.person_id = '2'

Jeg er lidt rusten i JOIN-syntaxen, så jeg er ikke lige helt 100% sikker på
at nummer 2 ovenfor kan køres uden syntaxfejl, men mulighed 1 burde give det
samme. Ved at skrive FROM tabel1, tabel2, tabel3 bliver alle 3 tabeller
join'et, og så putter man sammenhængen i where-klaususlen - i form af at
binde person-id'et sammen med link-tabellens person-id, og status-id'et med
link-tabellens status-id. Og så en ekstra where klausul med den person du
ønsker at hive ud. Du kan også vende det hele om, så du finder alle de
personer, der har en given status. Så skal du bare "SELECT navn FROM..." i
stedet for, og så ændre den sidste where klausul til "AND status.id = '1'"

Håber det kan hjælpe dig.

/Sjang



Janus Høi (17-02-2007)
Kommentar
Fra : Janus Høi


Dato : 17-02-07 12:22

On 17 Feb., 11:30, "Henrik Davidsen" <n...@none.dk> wrote:
>
> Det kan også skrives med JOIN som du var inde på:

Nu kommer der da noget i outputtet man kan bruge.

Tak for hjælpen.
--
Janus


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

Månedens bedste
Årets bedste
Sidste års bedste