mboost-dp1

MySQL advanced JOIN


Gå til bund
Gravatar #1 - røvskæg
7. dec. 2009 21:33
Hej Newz'ere jeg har to tables som skal joines via en "link"-table
Jeg kan godt LEFT JOINE på den ene led og den anden led, men det jeg har brug for er at tabellerne bliver JOIN'et således at alle entries i begge tabeller bliver vist uanset om "den andens række" er tom.

For at forenkle det :
table t1:

------------
| k | v |
------------
| 1 | v1.1 |
| 2 | v1.2 |
------------


table t2 :

------------
| k | v |
------------
| 2 | v2.1 |
| 3 | v2.2 |
------------


SELECT t1.k, t1.v, t2.k, t2.v ....... JOIN t1 ... t2 ON (t1.k=t2.k)
Ønsket resultat :

-----------------------------
| t1.k | t1.v | t2.k | t2.v |
-----------------------------
| 1 | v1.1 | | |
| 2 | v1.2 | 2 | v2.1 |
| | | 3 | v2.2 |
------------------------------

Jeg kunne måske godt klare det med at "joine" med where t1.k=t2.k, men noget siger mig at det er mere rigtigt at bruge JOIN. Desuden er det også tre tabeller, der skal joines.

Kan man ikke bruge noget STRAIGHT_JOIN NATURAL CROSS INNER OUTER LEFT USING ?
Gravatar #2 - T-Hawk
7. dec. 2009 21:38
Mener det du leder efter må være FULL JOIN.
Så vidt jeg husker fra mit databasekurses så vil det lave en JOIN hvor alle rækker inkluderes fra begge tabeller, og hvis de ikke matcher på det du joiner på, vil der blive indsat NULL værdier, så:

SELECT * FROM t1 FULL JOIN t2 ON t1.v = t2.v

Eller sådan noget lignende
Gravatar #3 - apocs
7. dec. 2009 21:51
Vil da mene det bare skal være:
SELECT * FROM t1 JOIN t2 USING(k)

Gravatar #4 - T-Hawk
7. dec. 2009 21:54
apocs (3) skrev:
Vil da mene det bare skal være:
SELECT * FROM t1 JOIN t2 USING(k)

Good point
Gravatar #5 - røvskæg
7. dec. 2009 21:56
#2 Det lydder lækkert, men efter at have kigget på det, må jeg spørge dig om det kursus ikke var i oracle ? Det lader til at mysql kommer til kort når det kommer til FULL.
Men tak. Det hjælper mig med at google i den rigtige retning.

#4 jeg prøver det.
Gravatar #6 - apocs
7. dec. 2009 21:58
#5: Der er ikke noget i MySQL's dokumentation der beskriver muligheden for "FULL JOIN". Umiddelbart, så er det bare det, MySQL gør, når du bruger "JOIN"
Gravatar #7 - røvskæg
7. dec. 2009 22:13
#6 Jeg opnår ikke den ønskede efekt ved bare at bruge JOIN. Så droppes alle rækker, hvor der ikke står noget i begge tabeller.

Ang. USING :
Nu er mit simple eksempel lidt dårligt, da det er tre tables der skal joines og de columns de skal joine på hedder ikke det samme, så så vidt jen kan forstå kan jeg ikke bruge den med USING. Det kan godt være den ville virke i min simplifiseringen.

Så vidt jen kan forstå, så det jeg mangler er en FULL OUTER JOIN funktionalitet.

Hvordan faker man så det i mySQL ?

Kan man lave en LEFT AND RIGHT JOIN ?
Gravatar #8 - arne_v
7. dec. 2009 22:15
#1 & 7

Prøv:

SELECT *
FROM t1,t2
WHERE (t1.k=t2.k OR t1.k IS NULL OR t2.k IS NULL)
Gravatar #9 - arne_v
7. dec. 2009 22:16
#6

Nej. JOIN er INNER JOIN.
Gravatar #10 - røvskæg
7. dec. 2009 22:25
#8 Det er også sådan noget jeg er ved at rode mig ud i.

Nu fandt jeg lige denne :
How to simulate FULL OUTER JOIN in MySQL
der ser lidt spændende ud.

Jeg når ikke mere i dag, men indtil videre så tak for hjælpen.
Gravatar #11 - apocs
7. dec. 2009 22:25
#9: Jeps :) - men vil derfor stadig mene at

SELECT * FROM t1 JOIN t2 USING(k);

Skulle virke
Gravatar #12 - apocs
7. dec. 2009 22:26
#1: Hvad giver resultatet egentlig?
Gravatar #13 - røvskæg
7. dec. 2009 22:30
#12 Det ønskede resultat i #1 kommer fra : tab-tib-tab-taba-tab-tib-tab på keyboardet :-)
Gravatar #14 - apocs
7. dec. 2009 22:36
ah, det skal nok være sådan her:
SELECT t1.k as t1k, t1.v as t1v, t2.* JOIN t2 USING(k);

Gravatar #15 - zin
7. dec. 2009 23:11
Jeg tænker, siden du skal have dem med, selvom de er tomme, at du burde lave det med et Nested SELECT. Måske er jeg helt af på den.
Gravatar #16 - T-Hawk
8. dec. 2009 07:20
røvskæg (5) skrev:
#2 Det lydder lækkert, men efter at have kigget på det, må jeg spørge dig om det kursus ikke var i oracle ?

Det var faktisk i SQL generelt (altså efter standarden), praktisk arbejde blev dog udført i DB2, men da ingen implementerer hele standarden så skal det nok passe at mySQL ikke har support for FULL JOIN, ligesåvel som DB2 ikke har support for NATURAL JOIN eller ASSERTIONS
Gravatar #17 - røvskæg
8. dec. 2009 20:00
Tak skal i alle have.
Jeg har lavet en løsning med UNION og 2 * LEFT JOIN først den ene vej og så den anden vej.

Virker perfekt.
Gå til top

Opret dig som bruger i dag

Det er gratis, og du binder dig ikke til noget.

Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.

Opret Bruger Login