webForumDet fria alternativet

Problem med en sql-fråga eller två...

5 svar · 177 visningar · startad av K@llen

K@llenMedlem sedan mars 20032 667 inlägg
#1
-- forum --
forumId (int)
forumName (varchar)
isPublic (1/0, true/false)

-- privateForumList --
forumId (int)
memberId (int)

-- message --
messageId (int)
forumId (int)
subject (varchar)
message (text)

Behöver hjälp med att hämta ut de 10 senast aktiva trådarna. Problemen är två:

* att man kan läsa inlägg utan att vara medlem
* att man som medlem kan ha tillgång privata forum

Så är man inte inloggad ska jag lista de tio senast aktiva trådarna och där tillhörande forum.isPublic är 1. Är man inloggad sparas detta i en sessionvariabel. Detta är egentligen inte mitt problem.

Problemet kommer om man är inloggad, då vill jag ha med de privata forumen också. Alltså ska den hämta de tio senaste inläggen ovasett om forum.isPublic är 1 eller 0. Men frågan ska också ta med de forumen där privateForumList.memberId är samma som aktuellt sessionId. Det är inte säkert att tabellen privateForumList innehåller något memberId som matchar.

Enklaste är väl två frågor som körs beroende på inloggadstatus, men det går kanske med en?

dbms: mysql

LarsGMedlem sedan dec. 200012 464 inlägg
#2

Två frågor är väl bra då det alltid är bara en av dom som utförs.

Om du försöker slå ihop dom blir det säkert en mindre effektiv fråga.

K@llenMedlem sedan mars 20032 667 inlägg
#3

Problemet kommer om man är inloggad, då vill jag ha med de privata forumen också. Alltså ska den hämta de tio senaste inläggen ovasett om forum.isPublic är 1 eller 0. Men frågan ska också ta med de forumen där privateForumList.memberId är samma som aktuellt sessionId. Det är inte säkert att tabellen privateForumList innehåller något memberId som matchar.

Ok,

Vad bör detta vara för slags join för att få med tabellen privateForumList så att frågan ger träff oavsett om det finns passande data i tabellen eller inte?

$sql ="select m.subject, m.message, f.forumName
from forum f
inner join message m
on ( f.forumId = m.forumId )
XXXX join privateForumList pfl
on ( m.forumId = pfl.forumId )
where pfl.memberId = " .  $_SESSION['uid'] . " 
order by messageId DESC
limit 10 ";
LarsGMedlem sedan dec. 200012 464 inlägg
#4

en left join men då kan du inte ha

pfl.memberId = " . $_SESSION['uid'] . "

med i where.

K@llenMedlem sedan mars 20032 667 inlägg
#5

LarsG skrev:

en left join men då kan du inte ha

pfl.memberId = " . $_SESSION['uid'] . "

med i where.

Kan jag lägga den i ON-villkoret och ha med pfl.memberId IS NULL i where-villkoret?

K@llenMedlem sedan mars 20032 667 inlägg
#6

Kom på att IS NULL inte behövs, för den ska ju inte ge träff om tabellen är tom :D

132 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)