Avatar billede websafe Nybegynder
08. august 2006 - 20:06 Der er 7 kommentarer

INNER JOIN joiner ikke korrekt.

Jeg har et (simplificeret) SQL-statement der gerne skulle joine to tabeller  - abdk_hometypes og abdk_hometypes_rel - som gerne skulle joines, således at en record i abdk_hometypes bliver "udvidet" med kolonnen 'hometype_rel_value' fra abdk_hometypes_rel:

SELECT abdk_hometypes.hometypeid, abdk_hometypes_rel.hometype_rel_value
FROM abdk_hometypes, abdk_hometypes_rel
INNER JOIN abdk_hometypes ht ON abdk_hometypes_rel.hometype_rel_value = ht.hometypeid
WHERE abdk_hometypes_rel.hometype_rel_owner =2
LIMIT 0, 30

Problemet er, at jeg får følgende resultat:

hometypeid  hometype_rel_value
1            2
2            2
3            2
1            3
2            3
3            3

Resultatet, jeg gerne vil have MySQL til at give mig, er:

hometypeid  hometype_rel_value
1            1
2            2
3            3

Er der nogen, der har et bud på, hvad der går galt her? Så vidt jeg kan se, er der nogenlunde overensstemmelse mellem mit statement og det eksempel, der er givet på http://www.w3schools.com/sql/sql_join.asp (under 'Example INNER JOIN')
Avatar billede plx Nybegynder
08. august 2006 - 20:12 #1
du skal kun angive abdk_ i din from når du laver en join
Avatar billede websafe Nybegynder
08. august 2006 - 20:17 #2
plx >> Kan du uddybe det lidt? 'abdk_' er ikke et gyldigt table-navn.
Avatar billede plx Nybegynder
08. august 2006 - 20:21 #3
det gik vist også lidt stærkt med at skrive. du skal kun skrive den ene tabel

FROM abdk_hometypes_rel
INNER JOIN abdk_hometypes
Avatar billede websafe Nybegynder
08. august 2006 - 20:23 #4
plx >> Det giver følgende fejl:

#1109 - Unknown table 'abdk_hometypes' in field list
Avatar billede websafe Nybegynder
08. august 2006 - 20:48 #5
Jeg har fundet 'fejlen'. Ved at joine abdk_hometypes_rel med abdk_hometypes - i stedet for omvendt - fremkommer det ønskede resultat.

SELECT abdk_hometypes.hometypeid, abdk_hometypes_rel.hometype_rel_value
FROM abdk_hometypes_rel, abdk_hometypes
INNER JOIN abdk_hometypes_rel htr ON abdk_hometypes.hometypeid = abdk_hometypes_rel.hometype_rel_value
WHERE abdk_hometypes_rel.hometype_rel_owner =2
LIMIT 0 , 30

plx >> Spørg mig ikke hvordan, men din kommentar inspirerede til løsningen, så smid lige et svar :-)
Avatar billede kjulius Novice
08. august 2006 - 23:26 #6
Må jeg være så fræk at spørge om noget?

Er der en grund til at du laver en join fra abdk_hometypes_rel til sig selv? Du specificerer begge tabeller separeret med komma. Det svarer til at der bliver returneret alle rows i tabel to for hver row i tabel et. I hvert fald hvis det ikke afgrænses i WHERE sætningen, hvor kan kan lave en pseudo INNER JOIN ved at knytte felter fra de to tabeller sammen. Det gør du bare ikke i dette tilfælde. I andre SQL versioner kan en SQL som din også beskrives som (jeg opfører det bare fordi det måske kan belyse det lidt bedre på den måde):

SELECT abdk_hometypes.hometypeid, abdk_hometypes_rel.hometype_rel_value
FROM abdk_hometypes_rel
CROSS JOIN abdk_hometypes
INNER JOIN abdk_hometypes_rel htr ON abdk_hometypes.hometypeid = abdk_hometypes_rel.hometype_rel_value
WHERE abdk_hometypes_rel.hometype_rel_owner =2

Er du sikker på, at du ikke bare kunne nøjes med en INNER JOIN mellem de to tabeller?

SELECT abdk_hometypes.hometypeid, abdk_hometypes_rel.hometype_rel_value
FROM abdk_hometypes
INNER JOIN abdk_hometypes_rel ON abdk_hometypes.hometypeid = abdk_hometypes_rel.hometype_rel_value
WHERE abdk_hometypes_rel.hometype_rel_owner =2
Avatar billede websafe Nybegynder
09. august 2006 - 18:46 #7
kjulius >> Du har bestemt fat i noget. På det tidspunkt, hvor jeg postede spørgsmålet, havde jeg bakset rundt med mit statement i flere timer - og tænkte måske ikke helt så logisk, som man kunne ønske...

- Så tak for tippet :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester