2011-10-01 31 views
1

我有兩個表:一個主題表和一個連接的評論表,都帶有時間戳列。我想訂購主題列表,以便最新評論的主題位於頂部。但是,如果主題沒有評論,我希望它按創建日期排序。 換句話說我想,如果他們有沒有意見訂購它,這樣的主題是由他們創造日期排列 - 基本上就像任何論壇。例如,如果在主題B(非空)之後創建了主題A(空),但主題B具有最近的回覆,那麼順序應該是B,A.我不希望頂部的所有空主題如果如果它們是新的,它們就會老舊或者處於底部。如果其他列爲空,則按一列排序

我試過IF ISNULL聲明,但它適用於整列,而不是每個單排,所以我結束與空線程要麼停留在飼料的頂部或底部。

我猜我不得不構建,只有從每個主題的最新評論一個虛擬列...?

以下是聲明全文:

SELECT 
    $showbody, 
    Topics.Title, 
    Topics.id AS tID, 
    Topics.Timestamp, 
    Topics.MemberID, 
    Users.id, 
    Users.FirstName, 
    Users.LastName, 
    GROUP_CONCAT(DISTINCT Tags.Keywords SEPARATOR ', ') AS Tags, 
    COUNT(Comments.id) AS NumberOfComments, 
    (
    SELECT COUNT(Comments.id) 
    FROM Comments 
     LEFT JOIN Views ON Comments.TopicID = Views.TopicID 
    WHERE Comments.Timestamp > Views.Visited 
) AS NewComments 
FROM Topics 
    LEFT JOIN Users ON Topics.MemberID = Users.ID 
    LEFT JOIN Comments ON Topics.id = Comments.TopicID 
    LEFT JOIN Tags ON Topics.id = Tags.TopicID 
WHERE Topics.id NOT IN (
    SELECT Tags.TopicID 
    FROM Tags 
    WHERE Keywords IN (
    SELECT Tag 
    FROM Filters 
    WHERE MemberID = '$_SESSION[SESS_MEMBER_ID]' 
) 
    GROUP BY Tags.TopicID 
) 
GROUP BY Topics.id 
ORDER BY Comments.Timestamp, Topics.Timestamp DESC LIMIT $plim 

任何幫助,將不勝感激

+1

你可以在這裏粘貼你的代碼嗎? – Bajrang

+0

請出示實際的SQL語句... – Yahia

回答

2

溶液1(演示):

-- Test initialization 
CREATE TABLE Question 
(
    QuestionID INT AUTO_INCREMENT PRIMARY KEY 
    ,Content NVARCHAR(100) NOT NULL 
    ,CreateDate DATETIME NOT NULL -- DEFAULT NOW() 
); 

CREATE TABLE QuestionComment 
(
    QuestionCommentID INT AUTO_INCREMENT PRIMARY KEY 
    ,QuestionID INT NOT NULL REFERENCES Question(QuestionID) 
    ,Content NVARCHAR(100) NOT NULL 
    ,CreateDate DATETIME NOT NULL -- DEFAULT NOW() 
); 

INSERT Question(Content, CreateDate) 
SELECT 'Question 1','2011-01-01 01:00:00' 
UNION ALL 
SELECT 'Question 2','2011-01-01 02:00:00' 
UNION ALL 
SELECT 'Question 3','2011-01-01 03:00:00'; 

INSERT QuestionComment(QuestionID, Content, CreateDate) 
SELECT 1,'Comment 1.1','2011-01-01 01:30:00' 
UNION ALL 
SELECT 2,'Comment 2.1','2011-01-01 02:30:00' 
UNION ALL 
SELECT 1,'Comment 1.2','2011-01-01 02:40:00' 
UNION ALL 
SELECT 2,'Comment 2.2','2011-01-01 02:30:00' 
UNION ALL 
SELECT 1,'Comment 1.3','2011-01-01 03:30:00'; 
-- End of Test initialization 

-- Solution 
SELECT * 
FROM Question q 
LEFT JOIN 
(
    SELECT qc.QuestionID, MAX(qc.CreateDate) LastCreateDate 
    FROM QuestionComment qc 
    GROUP BY qc.QuestionID 
) qc ON q.QuestionID=qc.QuestionID 
ORDER BY IFNULL(qc.LastCreateDate, q.CreateDate) ASC; 
-- End of Solution 

-- By, by 
DROP TABLE QuestionComment; 
DROP TABLE Question; 

結果:

2 Question 2 2011-01-01 02:00:00 2 2011-01-01 02:30:00 
3 Question 3 2011-01-01 03:00:00  
1 Question 1 2011-01-01 01:00:00 1 2011-01-01 03:30:00 

解決方案2:

SELECT * 
FROM Topics t 
LEFT JOIN 
(
    SELECT c.TopicID, MAX(Timestamp) LastTimestamp 
    FROM Comments c 
    GROUP BY c.TopicID 
) c ON t.id = c.TopicID 
ORDER BY IFNULL(c.LastTimestamp, t.Timestamp) ASC 
+0

使用'ORDER BY IFNULL(MAX(Comments.Timestamp),Topics.Timestamp)ASC'我不斷地收到頂部的空白主題和底部更新的評論。我做了一些不正確的事嗎? – Miles

+0

這種行爲是正常的,因爲'MAX(Comments.Timestamp)'(對於沒有註釋的主題)將首先顯示NULL和NULL。嘗試使用我的方法。 –

+0

看看我最後一個關於'NULL'排序順序的例子。 –

1

使用LEFT JOIN的意見,對課題小組,使用max拿到最後一個註釋的時候,並使用coalesce(或isnull)對註釋日期進行排序,如果它存在的話,否則就是創建日期。

實施例:

select t.Title, t.CreatedDate, max(c.CreatedDate) as LastComment 
from Topics t 
left join Comment c on c.TopicId = t.TopicId 
group by t.Title, t.CreatedDate 
order by coalesce(max(c.CreatedDate), t.CreatedDate) desc 
+0

這似乎不工作,空留線在頂部和在底部 – Miles

+0

@Miles最新評論螺紋:我忘了'desc'在'按順序排列。 – Guffa

+0

這隻會導致所有空線收集在底部,在某些方面更糟糕;如果有人創建了一個主題,它將被放在最後一個沒有人會看到它的頁面上。相反的,如果它正在提升舊的話題,那麼沒有人回答的話就會停留在頂部而不是漂移到堆底。我試圖對活動中的線索進行排序,而不是對他們是否有答覆。 – Miles

相關問題