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";
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.
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
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
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