2010-06-03 26 views
0

請看截圖:幫助與某個單一(評論)表中的SQL查詢(包括截圖)

目標:

  • ID喜歡有評論嵌套1級深
  • 將安排評論,以便父母的評分從高到低
  • 評論的子女評論是無關緊要的

屏幕截圖的左側顯示了Id喜歡的輸出。 RHS顯示錶格數據。所有評論都在1張表中。

我是個與SQL查詢的初學者,我能做的最好的是:

SELECT * 
FROM [Comments] 
WHERE ([ArticleId] = @ArticleId) ORDER BY [ThreadId] DESC, [DateMade] 

這個有點做工作,但它顯然忽略了評級。因此,上述聲明將顯示Bob的評論和所有孩子評論都在Amy和她的孩子評論之前的輸出。 如何正確運行此查詢?

回答

1
SELECT c.* 
FROM Comments AS c 
JOIN Comments AS tr ON tr.threadID = c.threadID 
AND tr.ArticleId = c.ArticleId AND tr.isParent = 1 
WHERE (c.ArticleId = @ArticleId) 
ORDER BY tr.Rating DESC, c.ThreadId DESC, c.DateMade 

你必須加入該表本身得到父母的情況下,通過螺紋等級排序等級 那麼你先,然後通過線程ID的線程具有相同的等級,然後通過評論日期。

您不必在日期之前推送int排序c.isParent DESC因爲這是線程中最老的註釋。

+0

謝謝,我昨天花了整整一天的時間試圖找點工作。我花了很多時間查看案件陳述無濟於事。我甚至沒有考慮過自己加入一張桌子,感謝這個見解。向任何正在閱讀的人澄清問題。 1)如果我把父母和孩子放在單獨的桌子上,我會過得更好嗎? 2)上述查詢是否被認爲是「昂貴的」,或者是在處理最初的需求時需要的典型查詢類型,只是想了解更多,謝謝 – citrus 2010-06-03 22:33:23

+0

1)我認爲沒有。我想到的是,存儲一個額外的字段「threaRating」以防止加入,而不得不更新1 + n對線程評級更改的評論。 2)因爲它是1:1連接,只要你的索引設置正確,以便快速查找,它不應該是昂貴的。 – 2010-06-03 23:33:00

0

我想這樣的事情可能會接近。

SELECT孩子。* 自評父母,子女的評論WHERE = parent.id child.parent_id ORDER BY parent.rating DESC,DateMade DESC

這將有奇怪的結果,如果2評級線程是一樣的,所以你必須以某種方式來訂購。