Fungerar "left outer joins" med tomma tabeller?

Tråden skapades och har fått 4 svar. Det senaste inlägget skrevs .
1

Jag upptäckte just ett skumt SQL-fenomen. Jag har tre tabeller en med användare, en med komponenter och en tabell som kopplar ihop användare och komponenter i en många till många-relation. Vad komponenter är spelar ingen större roll men i just det här fallet har det med rättigheter att göra.

Hur som helst vill jag välja ut en användare med alla sina tillhörande komponenter men om användaren inte har någon komponent kopplad till sig vill jag ändå ha ut användaren men med nullvärden där komponentens värden brukar vara.

Det fungerar oftast bra men inte alltid. Om relationstabellen inte innehåller några rader alls får jag heller inte tillbaka några rader. Om den innehåller minst en rad (med vilket värde som helst) får jag tillbaka det förväntade resultatet dvs. alltid användaren och om denne har komponenter kopplade till sig får jag även dessa.

Jag har två frågor angående detta:

1. Är det en bugg i MySQL? Någon som sett något liknande tidigare?

2. Finns det ett sätt att göra left outer joins på en liknande tre-tabellers-kombination och slippa få null-värden endast i de fall då användaren har minst en riktig komponent kopplad till sig?

Är det nåt sånt här du gör?

select users.namn, users.id, komponent.namn, relation.user from (users left join komponent on users.id = relation.intquestion) left join komponent on komponent.id = relation.komponentid

Hmmm, nej inte riktigt, jag använder bara en left join, det kanske är det som är felet?

Det ser mer ut såhär:

SELECT users.name, components.name
FROM users
LEFT OUTER JOIN components, usercomponents
ON usercomponents.user_id = users.id AND usercomponents.component_id = components.id
WHERE users.id = 1

Sist jag var begravd i MySQL (om det är det du använder ser så ut) så hade just MySQL vissa begrännsningar vad det gällde join kommandona. Men jag har inte hållt på med version 4 nå mycket så det kanaske är fixat.

Jag tror att det du vill uppnå är exakt samma som jag precis gjort för ett frågespel. Det blev inte helt rätt när jag bytte ut tabellnamnen ovan, så jag visar den kod som funkar för mig.

Tabellerna är
tbl_questions - frågorna
tbl_qcategories - frågekategorierna
tbl_questioncategories - relationstabellen

sql-strängen
SELECT tbl_questions.strquestion, tbl_qcategories.strname
FROM (
tbl_questions
LEFT JOIN tbl_questioncategories ON tbl_questions.id = tbl_questioncategories.intquestion
)
LEFT JOIN tbl_qcategories ON tbl_questioncategories.intcategory = tbl_qcategories.id
WHERE tbl_questions.id = 5011
hämtar ut fråga 5011 och om frågan är kopplad till en kategori så visas den. Om ingen kategori finns så visas frågan och null i kategorifältet.

Funkar för mig på MySQL 3.23.56.

1
Bevaka tråden