2011-05-16 115 views
0

我喜歡爲我的網站製作一個論壇傳情。它很容易顯示最新的帖子或線程。我喜歡在最後一次活動中排序的同一個查詢中獲取最新主題和帖子。所以它將通過REPLY TO POST日期和THREAD POST日期在相同的查詢中進行排序。我認爲它與你如何分組有關,但我不確定。PHP MYSQL論壇傳情,howto?

線程

id, header, text, date, author 

訊息的使用

id, text, date, author, thread_id 

19分鐘前 - 如何使PHP/MySQL的腳本(2)

34分鐘前 - 請幫我在這裏(0)

1小時前 - 我需要用PHP幫助(1)

如您所見,回答的線程和新線程都在列表中。 (我需要最新回覆的日期或創建時間,標題和回覆數())

我希望你能得到,並知道如何去做。

特勒爾斯

UPDATE:

我都這樣了,它的好,但我只用回信獲得線程。

SELECT 
    threads.*, 
    posts.*, 
    (SELECT date FROM posts WHERE thread_id = threads.id ORDER BY date DESC LIMIT 0,1) AS postdate, 
    (SELECT count(id) FROM threads WHERE thread_id = thread.id) AS replys 
FROM 
    threads, 
    posts 
WHERE 
    threads.id = posts.thread_id 
GROUP BY 
    thread_id 
ORDER BY 
    postdate DESC, 
    thread.date 
LIMIT 
    0,15 

我該怎麼辦?

UPDATE

aaaaaaaaaaaaaaaaawwwww呀!!!!

我設法做我自己:-)花了一段時間纔得到它的權利。

SELECT 
    fisk_debat.id, 
    fisk_debat.dato, 
    IF((SELECT count(id) FROM fisk_debat_svar WHERE debatid = fisk_debat.id) < 1, fisk_debat.dato, (SELECT dato FROM fisk_debat_svar WHERE debatid = fisk_debat.id ORDER BY dato DESC LIMIT 0,1)) AS svardato, 
    fisk_debat.overskrift, 
    (
    SELECT count(fisk_debat_svar.debatid) 
    FROM fisk_debat_svar 
    WHERE fisk_debat_svar.debatid = fisk_debat.id 
    ) AS svar 

FROM fisk_debat 
GROUP BY id 
UNION 
SELECT 
    fisk_debat_svar.debatid AS id, 
    max(fisk_debat_svar.dato) AS dato, 
    max(fisk_debat_svar.dato) AS svardato, 
    (
    SELECT fisk_debat.overskrift 
    FROM fisk_debat 
    WHERE fisk_debat.id = fisk_debat_svar.debatid 
    ) AS overskrift, 
    (
    SELECT count(fisk_debat_svar.debatid) 
    FROM fisk_debat_svar 
    WHERE fisk_debat_svar.debatid = id 
    ) AS svar 

FROM fisk_debat_svar 
WHERE id != id 
GROUP BY id 

ORDER BY svardato DESC, dato DESC 
LIMIT 0,15 
+0

已開發了論壇軟件自己?數據庫結構看起來有缺陷,線程中的「原始帖子」也應該放在** posts **表中。這也會讓你的查詢更容易。 – Stijn 2011-05-16 11:50:58

+0

嘿。是的,我自己開發了它。原來的帖子應該在那裏。 – Holsteinkaa 2011-05-16 11:52:46

+0

如果不檢查您的整個查詢,您在第4行有一個錯字。 **(SELECT dato **應該是**(選擇日期** – Stijn 2011-05-16 12:06:40

回答

0

WHERE子句只選擇有回覆的線程,這是正常的。您必須使用LEFT JOIN語法。

試試這個:

SELECT 
    threads.*, 
    posts.*, 
    (SELECT date FROM posts WHERE thread_id = threads.id ORDER BY date DESC LIMIT 0,1) AS postdate, 
    (SELECT count(id) FROM threads WHERE thread_id = thread.id) AS replys 
FROM 
    threads 
LEFT JOIN 
    posts 
ON 
    threads.id = posts.thread_id 
ORDER BY 
    postdate DESC, 
    thread.date 
LIMIT 
    0,15 
+0

好吧,它似乎沒有工作我也需要原始線程的日期,如果他們沒有任何回覆。 – Holsteinkaa 2011-05-16 12:43:56