webForumDet fria alternativet

Hjälp med sortering av trådar i forum

Databaser & SQL

8 svar · 360 visningar · startad av lillebror

Medlem sedan apr. 20041 597 inlägg
Frågan#1

Hej,

Jag håller på och utvecklar ett eget forum. Har kommit en bra bit på väg. Nu har jag dock ett litet problem när jag sorterar trådarna. Trådarna sorteras och visas inuläget efter det senaste svar en tråd har fått vilket presenteras som "senaste inlägg" i kolumnen med datum och vem som har skrivit det. Så långt fungerar det bra.

Problemet börjar när jag skapar en ny tråd. Då har denna tråd ej några underliggande svar var på denna tråd kommer hamna längst ned i listan när den istället borde ligga högst upp i listan. (se bifogad bild)

Här är min SQL-sats:

$sqlSelect = "SELECT threadID, subject, content, hits, posted, posterID, forumID,
(SELECT username FROM tblMember WHERE memberID = posterID) AS username,
(SELECT COUNT(t2.threadreplyID) FROM tblForumThreadReply AS t2 WHERE t2.threadID = t1.threadID) AS replynumber,
(SELECT DATE_FORMAT(t5.posted, '%Y-%m-%d %H:%i:%s') FROM tblForumThreadReply AS t5 WHERE t5.threadID = t1.threadID AND t1.forumID = $ID ORDER BY t5.posted DESC LIMIT 1) AS lastpost, 
(SELECT (SELECT t8.username FROM tblMember AS t8 WHERE t8.memberID = t5.posterID) 
FROM tblForumThreadReply AS t5 WHERE t5.threadID = t1.threadID AND t1.forumID = $ID ORDER BY t5.posted DESC LIMIT 1) AS usernamelastreply,
(SELECT t5.posterID FROM tblForumThreadReply AS t5 WHERE t5.threadID = t1.threadID AND t1.forumID = $ID ORDER BY t5.posted DESC LIMIT 1) AS posterIDlastreply
	FROM tblForumThread AS t1
	WHERE forumID = $ID ORDER BY lastpost DESC";

Hoppas någon förstår vad jag har gjort och har något tips på hur man kan lösa detta. Går det att skriva IF-satser i SQL-frågan. Det kunde kanske vara ett alternativ att använda en sådan :OO

En kort fråga till. När jag skapar ett alias för en tabell, är den global i HELA SQL-satsen eller enbart i den nästlande satsen som den befinner sig i?

forumdisplay.jpg
Medlem sedan dec. 200012 464 inlägg
#2
coalesce(
(SELECT DATE_FORMAT(max(t5.posted), '%Y-%m-%d %H:%i:%s') 
FROM tblForumThreadReply AS t5 
WHERE t5.threadID = t1.threadID 
AND t1.forumID = $ID ) , posted) AS lastpost

Vänligen formattera frågan så att man slipper scrollning i sidled.

Medlem sedan apr. 20041 597 inlägg
#3

Denna rad i min SQL-sats:

(SELECT DATE_FORMAT(t5.posted, '%Y-%m-%d %H:%i:%s') FROM tblForumThreadReply AS t5 WHERE t5.threadID = t1.threadID AND t1.forumID = $ID ORDER BY t5.posted DESC LIMIT 1) AS lastpost

Ersätts med:

LarsG skrev:

coalesce(
(SELECT DATE_FORMAT(max(t5.posted), '%Y-%m-%d %H:%i:%s') 
FROM tblForumThreadReply AS t5 
WHERE t5.threadID = t1.threadID 
AND t1.forumID = $ID ) , posted) AS lastpost

Korrekt uppfattat? :) Sen exakt vad gör funktionen coalesce()? :OO

Medlem sedan juni 200032 967 inlägg
#4

coalesce(uttryck1, uttryck2)

Om uttryck1 är null väljs uttryck2, annars uttryck1. (Hmm, gick det där att förstå?)

Medlem sedan apr. 20041 597 inlägg
#5

Jag kan bara meddela att det rockar fett nu! :e

Har en liten fråga till. I det genererade fältet AS usernamelastreply får jag ut den sista som har svarat i en tråd. Om tråden ännu inte innehåller något svar, kan jag få användarnamnet från den som har skapat huvudtråden på något liknande sätt som du gjorde med sorteringen innan?

forumdisplay_ver2.jpg
Medlem sedan apr. 20041 597 inlägg
#6

@nders skrev:

coalesce(uttryck1, uttryck2)

Om uttryck1 är null väljs uttryck2, annars uttryck1. (Hmm, gick det där att förstå?)

Jadå. Alltså, om det inte finns några replies i det första uttrycket så används posted för själva tråden istället för posted i svaret...

Medlem sedan dec. 200012 464 inlägg
#7

En detalj, att du har med detta i subselecten är överflödigt

AND t1.forumID = $ID
Medlem sedan apr. 20041 597 inlägg
#8

lillebror skrev:

I det genererade fältet AS usernamelastreply får jag ut den sista som har svarat i en tråd. Om tråden ännu inte innehåller något svar, kan jag få användarnamnet från den som har skapat huvudtråden på något liknande sätt som du gjorde med sorteringen innan?

coalesce() löste även detta problem :)

Medlem sedan apr. 20041 597 inlägg
#9

Suveränt. Tack för hjälpen! Trodde jag kört fast när jag stötte på dessa problem. Det är tur att det finns kompetenta människor som ni att rådfråga :)

258 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)
120 ms — ändringar (db)