2015-04-16 48 views
0
SELECT p.*, u.user_id, u.user_name, 
     COUNT(c.comment_id) AS count, 
     COUNT(v.vote_post_id)/
     (TIMESTAMPDIFF(MINUTE, v.vote_timestamp, SYSDATE()) + 1) AS rate 
FROM posts AS p 
LEFT JOIN comments AS c ON (p.post_id = c.comment_post_id) 
LEFT JOIN post_votes AS v ON (p.post_id = v.vote_post_id) 
LEFT JOIN users AS u ON (p.postedby_id = u.user_id) 
GROUP BY p.post_id 
ORDER BY COUNT(v.vote_post_id)/
    (TIMESTAMPDIFF(MINUTE, v.vote_timestamp, SYSDATE()) + 1) DESC 

這是我正在處理的腳本。我的db沒有很好地進行測試,但前兩項結果的評論數量翻了一番。你能在這裏看到任何明顯的錯誤嗎?我有一個在這裏很好的作品腳本的另一個版本:sql腳本中的奇怪錯誤

SELECT p.*, u.user_id, u.user_name, 
     COUNT(c.comment_id) AS count 
    FROM posts AS p 
    LEFT JOIN comments AS c ON (p.post_id = c.comment_post_id) 
    LEFT JOIN users AS u ON (p.postedby_id = u.user_id) 
    GROUP BY p.post_id 
    ORDER BY COUNT(c.comment_post_id)/
     (TIMESTAMPDIFF(MINUTE, p.post_timestamp, SYSDATE()) + 1) DESC 
+5

哪個dbms? (非ANSI SQL,如涉及TIMESTAMPDIFF ...) – jarlh

+2

什麼是你想要的確切輸出和你指定的內容 –

+1

它可能與第一個查詢中的額外連接有關 –

回答

1

多張選票會導致您的評論重複。如果您想在post_votes表上執行子選擇,則可以將每個帖子的總投票數作爲單個值獲得,如果您GROUP BYvote_post_id

由於COUNT是保留字,因此我不建議將它用作結果集中的列名稱。

如果你只是收到評論數,而不是評論本身,那麼你也會希望在一個子選擇中,或者你會在帖子上加倍。

SELECT p.*, u.user_id, u.user_name, c.comment_count, 
    v.vote_count AS total_votes, 
    v.vote_count/(TIMESTAMPDIFF(MINUTE, p.post_timestamp, SYSDATE()) + 1) as votes_per_minute 
FROM posts AS p 
LEFT JOIN (SELECT comment_post_id, COUNT(comment_post_id) AS comment_count FROM comments GROUP BY comment_post_id) AS c ON (p.post_id = c.comment_post_id) 
LEFT JOIN (SELECT vote_post_id, COUNT(vote_post_id) AS vote_count FROM post_votes GROUP BY vote_post_id) AS v ON (p.post_id = v.vote_post_id) 
LEFT JOIN users AS u ON (p.postedby_id = u.user_id) GROUP BY p.post_id 
ORDER BY v.vote_count/(TIMESTAMPDIFF(MINUTE, p.post_timestamp, SYSDATE()) + 1) DESC 
+0

當我嘗試運行這個查詢時,我得到了「#1054 - 'order clause'中的未知列'v.vote_timestamp'」。你能幫助嗎? – user3127399

+0

哦,是的 - 你想按照時間戳排序,而且我沒有把它作爲子選擇的一部分。我不完全確定你想用這種計算來完成什麼 - 它是每天投票嗎?如果是這樣,那麼這個計算就需要成爲子選擇的一部分,然後你可以在外部'SELECT'中返回它,並且也可以通過它進行排序。 – Danny

+0

它應該是所有帖子的列表,按其創建後每分鐘擁有最多票數的順序排列。但我需要獲得與帖子相關的所有評論的數量,以用於PHP目的。我並不擅長這個東西,而且它變得非常複雜。 – user3127399

0

顯然你正在使用MySQL becasue它是允許這種類型的組由唯一的數據庫。然而,100%的時間使用它是一個不好的選擇。您應該按照所有其他數據庫要求的方式,將select中不屬於聚合函數的所有字段進行分組。這是一個需要工作的團隊。這可能會清除你的問題。它可能不依賴於數據。如果您在某些連接表中有多個記錄,並且它們在某些字段中恰好有不同的數據,那麼在正確分組時您仍可能不會獲得一條記錄。在這種情況下,您需要爲連接編寫派生表,或者在具有多個值的字段上使用聚合來告訴數據庫使用哪個值。

+0

是啊......我對mysql並不是很瞭解,現在我的頭腦還在。你可能是對的,我將不得不閱讀更多關於連接和分組。謝謝您的幫助! – user3127399