webForumDet fria alternativet

Hjälp med sortering av trådar i forum - En gång till!

Databaser & SQL

6 svar · 333 visningar · startad av lillebror

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

Har ett snarliktproblem som jag hade i http://www.webforum.nu/showthread.php?s=&threadid=128482&forumid=53

Denna gång gäller det hur saker och ting visas i själva forumlistan. I denna lista har jag ett fält med senaste inlägg (se bifogad bild). Det SQL-frågan ska få fram är när senaste inlägget/tråden postades. Normalt sätt är detta inte något problem så länge en tråd inte är obesvarad. Det är då problemet dyker upp. Finns det en obesvarad tråd skapad senare än det sista svarsinlägget som skapades så skall trådens postdatum visas i senaste inlägget istället för svarsinlägget. Har försökt med funktionen coalesce() som fungerade alldeles ypperligt tidigare. Nu har jag gått bet på vad som är fel.

Här i SQL-koden som tar ut informationen för respektive forum:

$sqlSelect = "SELECT t2.forumID, t2.title, t2.description, 
(SELECT COUNT(t1.threadID) FROM tblForumThread AS t1 WHERE t1.forumID = t2.forumID) AS threadnumber, 

[B]coalesce((SELECT DATE_FORMAT(t3.posted, '%Y-%m-%d %H:%i') FROM tblForumThreadReply AS t3, tblForumThread AS t7 
WHERE t3.threadID = t7.threadID AND t7.forumID = t2.forumID ORDER BY t3.posted DESC LIMIT 1), 
(SELECT DATE_FORMAT(t7.posted, '%Y-%m-%d %H:%i') FROM tblForumThread AS t7 WHERE t7.forumID = t2.forumID ORDER BY t7.posted DESC LIMIT 1)) AS lastpost[/B],

[B]coalesce((SELECT t3.posterID FROM tblForumThreadReply AS t3, tblForumThread AS t7 WHERE t3.threadID = t7.threadID AND t7.forumID = t2.forumID ORDER BY t3.posted DESC LIMIT 1), 
(SELECT t7.posterID FROM tblForumThread AS t7 WHERE t7.forumID = t2.forumID ORDER BY t7.posted DESC LIMIT 1)) AS posterID[/B],
	(SELECT COUNT(threadreplyID) FROM tblForumThreadReply AS t3, tblForumThread AS t7 WHERE t3.threadID = t7.threadID AND t7.forumID = t2.forumID ORDER BY t3.posted DESC LIMIT 1) AS replynumber,

[B]coalesce((SELECT (SELECT t8.username FROM tblMember AS t8 WHERE t8.memberID = t3.posterID) FROM tblForumThreadReply AS t3, tblForumThread AS t7 
WHERE t3.threadID = t7.threadID AND t7.forumID = t2.forumID ORDER BY t3.posted DESC LIMIT 1), 
(SELECT (SELECT t8.username FROM tblMember AS t8 WHERE t8.memberID = t7.posterID) FROM tblForumThread AS t7 WHERE t7.forumID = t2.forumID ORDER BY t7.posted DESC LIMIT 1)) AS username[/B]
	FROM tblForum AS t2 
	WHERE t2.categoryID = $ID AND t2.visible = 1 ORDER BY t2.displayorder ASC";

Jag blir snurrig bara jag tittar på koden! :)

mainforum.jpg
Medlem sedan dec. 200012 464 inlägg
#2

För att få fram tidpunkt för sista postningen

select
 date_format((select max(posted)
    from (
      select t3.posted 
        from tblForumThreadReply AS t3, 
             tblForumThread AS t7 
      where t3.threadID = t7.threadID 
      and t7.forumID = t2.forumID
      union 
      select posted
      from tblForumThread AS t7 
      where t7.forumID = t2.forumID) dt),'%Y-%m-%d %H:%i') AS lastpost
  from tblForum AS t2 
 where t2.categoryID = $ID 
  and  t2.visible = 1 
 order by t2.displayorder asc

När det går lika bra med max så bör du låta bli att använda order by och limit i subfrågor eftersom det enbart fungerar i Mysql. Personligen skulle jag också låta bli date_format eftersom det är en presentationssak och hör mer hemma i presentationslagret.

Medlem sedan dec. 200012 464 inlägg
#3

Det går lika bra med coalesce

select
 coalesce(
     (select max(t3.posted)
        from tblForumThreadReply AS t3, 
             tblForumThread AS t7 
      where t3.threadID = t7.threadID 
      and t7.forumID = t2.forumID),
     (select posted
      from tblForumThread AS t7 
      where t7.forumID = t2.forumID)) AS lastpost
  from tblForum AS t2 
 where t2.categoryID = $ID 
  and  t2.visible = 1 
 order by t2.displayorder asc
Medlem sedan apr. 20041 597 inlägg
#4

Det första exemplet fick jag inte att fungera överhuvudtaget. I det andra exemplet är den enda synliga skillnaden att sekundrarna nu finns med i svaret eftersom inte DATE_FORMAT applicerats.

Som det är nu hämtar SQL-satsen ut det senaste svaret i ett av forumen. Om det finns en tråd utan svar som är nyare så vill jag att den ska skrivas ut.

Nu känns det som att det saknas ett vilkor i den fetmarkerade delen av den SQL-sats du skrev:

select
 coalesce(
     (select max(t3.posted)
        from tblForumThreadReply AS t3, 
             tblForumThread AS t7 
      where t3.threadID = t7.threadID 
      and t7.forumID = t2.forumID),
     [B](select posted
      from tblForumThread AS t7 
      where t7.forumID = t2.forumID)[/B]) AS lastpost
  from tblForum AS t2 
 where t2.categoryID = $ID 
  and  t2.visible = 1 
 order by t2.displayorder asc
Medlem sedan apr. 20041 597 inlägg
#5

Gick från ditt andra exempel till ditt första med union. Verkar smart att "smälta" ihop dessa tabeller. Som sagt, det kan ju då bara finnas en "sista" post.

Nu har jag problem. Får felmeddelandet Unknown table 't2' in where clause. Jag tolkar det som att den nästlande from-satsen inte känner igen t2.forumID från huvudsatsen? Am I right? :OO Jag har fetmarkerat dessa ställen nedan.

select
 date_format((select max(posted)
    from (
      select t3.posted 
        from tblForumThreadReply AS t3, 
             tblForumThread AS t7 
      where t3.threadID = t7.threadID 
      and t7.forumID = [B]t2.forumID[/B]
      union 
      select posted
      from tblForumThread AS t7 
      where t7.forumID = [B]t2.forumID[/B]) dt),'%Y-%m-%d %H:%i') AS lastpost
  from tblForum AS t2 
 where t2.categoryID = $ID 
  and  t2.visible = 1 
 order by t2.displayorder asc
Medlem sedan apr. 20041 597 inlägg
#6

Hur får man en tabell med ett alias i huvudsatsen att bli global i nästlande satser som behöver ett värde från frågan innan?

Medlem sedan apr. 20041 597 inlägg
#7

Någon idé?! :OO

259 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)
124 ms — ändringar (db)