webForumDet fria alternativet

Hjälp med JOIN

2 svar · 314 visningar · startad av lillebror

lillebrorMedlem sedan apr. 20041 597 inlägg
#1

Hej,

Jag håller på och bygger om mitt forum. Samtidigt passar jag på att göra om SQL-koden då jag ändrat på den grundläggande designen i databasen.

För att förenkla SQL-koden har jag börjat använda mig av JOIN i mina uttryck. Jag tror att jag har förstått principen för hur de ska användas men jag får inte riktigt det resultat jag vill ha ändå.

Nuvarande SQL-sats:

SELECT t1.*, t2.threadID, t3.postID, t2.subject, t3.content, t3.posted, t3.postedbymemberID, t4.username, 
(SELECT COUNT(threadID) FROM xtblforumthread AS t5 WHERE t5.forumID = t1.forumID) AS numberofthreads,
(SELECT COUNT(postID) FROM xtblforumpost AS t7 WHERE t7.threadID IN (SELECT t6.threadID FROM xtblforumthread AS t6 WHERE t6.forumID = t1.forumID)) AS numberofposts 
FROM xtblforum AS t1
INNER JOIN xtblforumthread AS t2 ON t1.forumID=t2.forumID
INNER JOIN xtblforumpost AS t3 ON t3.threadID=t2.threadID
INNER JOIN tblmember AS t4 ON t4.memberID=t3.postedbymemberID
WHERE t1.forumcategoryID = $categoryID AND t2.forumID = t1.forumID AND t3.threadID = t2.threadID AND t1.visible = 1 AND t1.forumgroupID = ".$inline."
ORDER BY t1.displayorder, t3.posted DESC LIMIT 0,3";

SQL-koden anropas från en funktion som heter getForum($categoryID) som matas med den kategori som forumet tillhör. Funktionen skall då hämta ut samtliga forum som tillhör en viss kategori med de fält som finns först i SQL-frågan.

I xtblForum hämtar jag ut den information som hör direkt till ett visst forum. I samma fråga vill jag även ha ut information om vilket inlägg som är det senaste postade inlägget i forum samt användarID och användarnamn för den personen som skapat inlägget. Inläggen lagras i tabellen xtblforumpost.

Så här ser det ut i phpMyAdmin när jag kört ovanstående kod:

Se bild i slutet av dokumentet.

Jag vill ha ut samtliga forum under exempelvis kategori 1 med hjälp av JOIN-kommandot. I mitt fall borde det bli runt 8 forum. För varje forum vill jag få ut följande fält:

t1.*,
t2.threadID
t3.postID
t2.subject
t3.content
t3.posted
t3.postedbymemberID
t4.username

Hur ska jag förändra SQL-koden? :)

sql-screen.jpg
LarsGMedlem sedan dec. 200012 464 inlägg
#2
SELECT t1.*, 
       t2.threadID, 
       t3.postID, 
       t2.subject, 
       t3.content, 
       t3.posted, 
       t3.postedbymemberID, 
       t4.username, 
 (SELECT COUNT(threadID) 
    FROM xtblforumthread AS t5 
   WHERE t5.forumID = t1.forumID) AS numberofthreads,
 (SELECT COUNT(postID) 
    FROM xtblforumpost AS t7 
   WHERE t7.threadID IN 
      (SELECT t6.threadID 
         FROM xtblforumthread AS t6 
        WHERE t6.forumID = t1.forumID)) AS numberofposts 
  FROM xtblforum AS t1
  INNER JOIN xtblforumthread AS t2 ON t1.forumID = t2.forumID
  INNER JOIN xtblforumpost AS t3 ON t3.threadID = t2.threadID
  INNER JOIN tblmember AS t4 ON t4.memberID = t3.postedbymemberID
  WHERE t1.forumcategoryID = $categoryID 
    AND t1.visible = 1 
    AND t1.forumgroupID = ".$inline."
    and posted = 
        (select max(posted)
           from xtblforumpost
          where xtblforumpost.threadid in
            (select threadid
               from xtblforumthread
              where xtblforumthread.forumid = t2.forumid))
  ORDER BY t1.displayorder, 
        t3.posted DESC
lillebrorMedlem sedan apr. 20041 597 inlägg
#3

Tack för hjälpen Lars!

Det var det här kodstycket som jag inte hade fått med:

and posted = 
        (select max(posted)
           from xtblforumpost
          where xtblforumpost.threadid in
            (select threadid
               from xtblforumthread
              where xtblforumthread.forumid = t2.forumid))

Det löste mitt problem! Nu visas allt som det ska! :)

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