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.
8 svar · 360 visningar · startad av lillebror
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?
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.
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
coalesce(uttryck1, uttryck2)
Om uttryck1 är null väljs uttryck2, annars uttryck1. (Hmm, gick det där att förstå?)
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?
@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...
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 :)
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 :)