webForumDet fria alternativet

Vad är JOIN?

10 svar · 661 visningar · startad av Swey

SweyMedlem sedan apr. 20003 971 inlägg
#1

Hej,
Vad är egentligen JOIN och vad används det för? Jag har inte lyckats förstå det efter att ha gått igenom dokumentationen.

Lite hjälp skulle vara bra.

------------------
- Swey
Bäst, vackrast, styggast...

fredrikMedlem sedan dec. 19991 072 inlägg
#2

Join använder du för att länka ihop två tabeller. Låt oss säga att du har följande tabeller:

artiklar
Art_id | col_id
1 | 1
2 | 1
3 | 2
--------------------
color
col_id | color
1 | gul
2 | röd
3 | blå

Istället för att ha allt i samma tabell lägger vi det i två olika, en med artiklar och en med färger.

Om vi nu ska hämta rätt färg till en viss artikel skriver vi:

SELECT color.color
FROM artiklar INNER JOIN
    color ON artiklar.col_id = color.col_id
WHERE (artiklar.art_id = 1)

Här hämtar vi färgen för den artikel som har artikelnummer 1. Eftersom col_id är 1 där artikelnumret är 1 så får vi färgen "gul" som svar.

Skulle vi hämtat där artikel_id var 3 skulle vi ex. fått röd som svar, eftersom col_id där var 2 och 2 står för röd i tabellen color.

Att använda join:s är ett måste om man ska bygga relationsdatabaser och indexerade tabeller.

Kanske blev lite "luddigt" svar, men du förstår nog!

------------------
Fredrik Klarqvist
fredrik.klarqvist@swipnet.se
www.streetwise.se/fredrik/

SweyMedlem sedan apr. 20003 971 inlägg
#3

Tack för ditt svar. Jag förstod hur du menade.

Att använda join:s är ett måste om man ska bygga relationsdatabaser och indexerade tabeller.

Vet inte om det stämmer. Vad är fördelen med JOIN? Det går lika bra att skriva

select color.color from artiklar, color where artiklar.col_id = color.col_id and artiklar.id = 1;

Koden blir lite mer lättläst med JOIN men finns det någon annan fördel?

Och kan man använda JOIN till något mer?

------------------
- Swey
Bäst, vackrast, styggast...

[Redigerat av Swey den 08 sep 2000]

fredrikMedlem sedan dec. 19991 072 inlägg
#4

I mitt exempel hade jag bara två tabeller som jag länkade ihop. Om vi kanske hade haft 7 eller 8 tabeller så hade det blivit väldigt krångligt att skriva utan joins.

Dessutom finns funktionerna "left" och "right" join som ex. kan plocka ut ALLA poster från den "vänstra" tabellen vare sig de stämmer överens med "where" satsen eller inte MEN bara de poster från den "högra" som stämmer med "where"-satsen.

Hoppas de klarnar lite nu!

------------------
Fredrik Klarqvist
fredrik.klarqvist@swipnet.se
www.streetwise.se/fredrik/

SweyMedlem sedan apr. 20003 971 inlägg
#5

RIGHT har jag inte hittat något om men LEFT var just det jag letade efter. Den funktionen finns inte i en SELECT-sats!

Nu en till fråga om JOIN. Jag har en användatdatabas och en artikeldatabas. Artikeldatabasen har två referenser till användaradatabasen. En skapare och en ändrare.

Användardatabasen (users): ID, Name
Artikeldatabas (arts): ID, CreateUserID, ModUserID

Jag kan använda följande SQL-sats för att få fram namnen på skaparna:

SELECT * FROM arts INNER JOIN users ON CreateUserID = users.ID

Hur gör jag nu för att ta ut båda namnen på samma gång?

------------------
- Swey
Bäst, vackrast, styggast...

fredrikMedlem sedan dec. 19991 072 inlägg
#6

hmmm... jag vet inte riktigt om jag har förstått frågan rätt men...jag antar att vad du vill göra är att plocka ut värden från båda tabellerna (?)

Då använder du samma sql-sats som du skrev fast du lägger till lite så det blir:

SELECT arts.createuserID, users.name
FROM arts INNER JOIN
    users ON arts.createuserID = users.ID

Här hämtar den alltså createuserID från arts och name från users.

Vad det nåt sånt du var ute efter?

------------------
Fredrik Klarqvist
fredrik.klarqvist@swipnet.se
www.streetwise.se/fredrik/

SweyMedlem sedan apr. 20003 971 inlägg
#7

Tack men du missförstod mig.

Hur gör jag nu för att ta ut båda namnen på samma gång?

Både CreateUserID och ModUserID pekar till en användare. Jag vet hur jag kan få ut en användare i taget(jag visade hur jag kunde få ut CreateUserID) men inte båda samtidigt.

Om arts ser ut så här:

+------+------------+---------+
| id   | createuser | moduser |
+------+------------+---------+
|    1 |          2 |       0 |
|    2 |          4 |       1 |
|    3 |          0 |       1 |
+------+------------+---------+

Så vill jag ha det så här:

+------+------------+---------+
| id   | createuser | moduser |
+------+------------+---------+
|    1 | Två        | Noll    |
|    2 | Fyra       | Ett     |
|    3 | Noll       | Ett     |
+------+------------+---------+

Namnen på användarna ligger i den andra tabellen.

Förstår du nu? :)

------------------
- Swey
Bäst, vackrast, styggast...

[Redigerat av Swey den 13 sep 2000]

SweyMedlem sedan apr. 20003 971 inlägg
#8

Vet någon? :q

------------------
- Swey
Bäst, vackrast, styggast...

emissionMedlem sedan dec. 19996 721 inlägg
#9

Vet inte om det stämmer. Vad är fördelen med JOIN? Det går lika bra att skriva

select color.color from artiklar, color where artiklar.col_id = color.col_id and artiklar.id = 1;

Det är också en join, bara en annan syntax.

emissionMedlem sedan dec. 19996 721 inlägg
#10

SELECT a1.id,u1.username AS createuser,u2.username AS moduser FROM arts a1, users u1, users u2 WHERE a1.createuserid=u1.userid AND a1.moduserid=u2.userid

Aliasing är svaret på din bön. :)

Det går självklart också att skriva med INNER JOIN

SweyMedlem sedan apr. 20003 971 inlägg
#11

emission, tack... jag kom på det själv efter att ha granskat felmeddelandena mycket noggrant. :)

------------------
- Swey
Bäst, vackrast, styggast...

128 ms totalt · 3 externa anrop · v20260731065814-full.3ab8d573
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
125 ms — hämta tråd, inlägg och bilagor (db)