webForumDet fria alternativet

Problem med en join!

3 svar · 480 visningar · startad av inspiro

inspiroMedlem sedan sep. 2005664 inlägg
#1

Håller på med ett forum där både registrerade och ej registrerade kan skriva. De som skriver utan att vara registrerade (eller inte är inloggade) får -1 i UserID-kolumnen. Men när jag försöker hämta alla topics så lyckas jag inte få joinen att fungera, den som joinar ihop topics-tabellen med user-tabellen pga det här med de oregistrerade användarna. Den hämtar istället ut ALLA användare varje gång jag har en topic med -1 som UserID.

Så här nånting vill jag göra... alltså hämta alla topics och de användare som skrivit samt även de topics som inte har någon användare:

FROM         ForumTopics INNER JOIN
                      Users ON ForumTopics.UserID = Users.ID OR ForumTopics.UserID = '-1'

Hjälp nån? Använder sql server.

emissionMedlem sedan dec. 19996 095 inlägg
#2

Din JOIN-klausul säger att kopplingen mellan ForumTopics och Users ska vara att de har samma UserID, eller att ForumTopics.UserID är -1, vilket m.a.o innebär att alla rader i Users uppfyller kriteriet när ForumTopics.UserID=-1.

Det enklaste, och på många sätt bästa, sättet är att lägga in en Guest-user i User-tabellen, med UserID=-1. Självklart en User som man inte kan logga in som. På så vis bli Guest en fullvärdig medlem i User-arkitekturen, och man kan ge och ta bort rättigheter på ett kontrollerat sätt.

Rent SQL-mässigt löses JOIN-problemet:

FROM         ForumTopics LEFT JOIN
                      Users ON ForumTopics.UserID = Users.ID
WHERE ForumTopics.UserID = '-1' OR Users.ID IS NOT NULL
inspiroMedlem sedan sep. 2005664 inlägg
#3

Aha, ok ja en guest kan förstås vara bra! Inte så dumt att lära sig ett exempel på en left join heller förstås... tackar! :) Är left join samma sak som left outer join?

emissionMedlem sedan dec. 19996 095 inlägg
#4

inspiro skrev:

Aha, ok ja en guest kan förstås vara bra!

Helt klart. Du slipper en massa undantagshantering i SQL-frågor, och på andra ställen.

inspiro skrev:

Är left join samma sak som left outer join?

Japp, det är bara en slarvigare syntax.

127 ms totalt · 3 externa anrop · cache AV · v20260731051352-full.56cc9887
0 ms — hämta statistik (cache)
0 ms — hämta forumlista (cache)
124 ms — hämta tråd, inlägg och bilagor (db)