Left join funkar inte...
Oavsätt om jag byter ut inner till Left eller right så visas inner join resultatet.
Jag skulle vilja ha alla poster ifrån tabellen "objecttype" oavsätt om personerna har poster eller ej.
Hur gör jag det?
1 2 3 4 5 6 7 | SELECT ot.id, ot.typename, count(o.objectid) commonCount, abs(o.Rate-o2.Rate) diff FROM objectsusers o inner JOIN objectsusers o2 ON o.objectid=o2.objectid inner JOIN objects ob on o.objectid = ob.id inner JOIN objecttype ot ON ot.id = ob.typeid WHERE o.username = 'kalle' and o2.username = 'pelle' group by ot.id |
Svara
Sv: Left join funkar inte...
Använd en outer join och säg att den högra sidan ska tas med (eftersom objecttype är på den "högra" sidan).
<code>
SELECT ot.id, ot.typename, count(o.objectid) commonCount, abs(o.Rate-o2.Rate) diff
FROM objectsusers o
inner JOIN objectsusers o2 ON o.objectid=o2.objectid
inner JOIN objects ob on o.objectid = ob.id
RIGHT OUTER JOIN objecttype ot ON ot.id = ob.typeid
WHERE o.username = 'kalle' and o2.username = 'pelle'
group by ot.id
</code>
Svara
Sv: Left join funkar inte...
Om du byter till "LEFT JOIN objecttype ot ON ot.id = ob.typeid" borde det fungera. Jag gissar att det är något annat fel. Vad händer om du tar bort objecttype helt från frågan, blir resultatet som du tänkt dej då?
/Johan
Svara
Sv:Left join funkar inte...
Nix, varken LEFT eller RIGHT fungerar, det ger samma resultat.
Jag kan inte ta bort tabellen "objecttype" för det är den som hela frågan bygger på, och jag grupperar ju även med en column ifrån den (tabellen).
Svara
Sv: Left join funkar inte...
Frågan i sig ser ganska konstig ut, verkar lite ologiskt att du vill göra en left join på objecttype när det är den som det mesta bygger på. Vad är det du vill åstadkomma? Vilken information finns i de olika tabellerna?
/Johan
Svara
Sv: Left join funkar inte...
Jag skulle för tydlighetens skull slänga om tabellerna lite
<code>
SELECT ot.id, ot.typename, COUNT(o.objectid) commonCount, ABS(o.Rate-o2.Rate) diff
FROM objecttype ot
LEFT JOIN objects ob ON ob.typeid = ot.id
LEFT JOIN objectsusers o ON o.objectid = ob.id
LEFT JOIN objectsusers o2 ON o2.objectid = ob.id
WHERE o.username = 'kalle' AND o2.username = 'pelle'
GROUP BY ot.id
</code>
Svara
Sv:Left join funkar inte...
Denna listar faktiskt alla rader som de skall, men lägger jag till kolumnerna "o.Rate" och "o2.Rate" så visar de fel resultat.
Fattar inte varför.
<code>SELECT ot.id, ot.typename, COUNT(o2.objectid) uCount
, o.Rate KalleRate
, o2.Rate PelleRate
FROM objecttype ot
LEFT JOIN objects ob ON ob.typeid = ot.id
LEFT JOIN objectsusers o ON o.objectid = ob.id AND o.username = 'Kalle'
LEFT JOIN objectsusers o2 ON o2.objectid = ob.id AND o2.username = 'Pelle'
GROUP BY ot.id</code>
Svara
Sv: Left join funkar inte...
Ok, då är frågan vad som är rätt och vad som är fel?
Hur allting visas beror på din data. En Group By grupperar helt rått alla rader, och finns det två olika värden på Rate i någon av fallen vet du inte vilket av värdena du får ut.
Om det bara finns ett unikt värde ska den ge rätt...
Svara
Sv: Left join funkar inte...
Grupperingen innebär ju att du kan få med flera o och o2 vilket du själv har insett eftersom du har med COUNT(o2.objectid).
Det kanske är något sådant här du vill ha.
<code>SELECT ot.id, ot.typename, COUNT(o2.objectid) uCount
, SUM(o.Rate) KalleRate
, SUM(o2.Rate) PelleRate
FROM objecttype ot
LEFT JOIN objects ob ON ob.typeid = ot.id
LEFT JOIN objectsusers o ON o.objectid = ob.id AND o.username = 'Kalle'
LEFT JOIN objectsusers o2 ON o2.objectid = ob.id AND o2.username = 'Pelle'
GROUP BY ot.id</code>
eller
<code>SELECT ot.id, ot.typename, COUNT(o2.objectid) uCount
, MAX(o.Rate) KalleRate
, MAX(o2.Rate) PelleRate
FROM objecttype ot
LEFT JOIN objects ob ON ob.typeid = ot.id
LEFT JOIN objectsusers o ON o.objectid = ob.id AND o.username = 'Kalle'
LEFT JOIN objectsusers o2 ON o2.objectid = ob.id AND o2.username = 'Pelle'
GROUP BY ot.id</code>
Med någon form funktion (AVG, MAX, MIN, SUM etc) på o.Rate och o2.Rate bör du kunna få riktiga svar från frågan.
Svara