2013-12-14 101 views
2

我有對posts和兩個表的表的簡單模式來跟蹤viewsupvotes聚合兩個不同的事件與一個單一的查詢表

CREATE TABLE posts (
    id integer NOT NULL PRIMARY KEY, 
    title VARCHAR(255) NOT NULL 
); 

CREATE TABLE views (
    post_id integer, 
    value integer 
); 

CREATE TABLE upvotes (
    post_id integer, 
    value integer 
); 

請注意:viewsupvotes元組代表一般數量的觀點和upvotes。我想彙總帖子,顯示的總觀看次數和點贊

我認爲這很簡單,但不幸的是我失敗了。

這是我的查詢:

SELECT posts.title, 
     SUM(views.value) AS views, 
     SUM(upvotes.value) AS upvotes 

FROM posts 
    LEFT OUTER JOIN views ON (posts.id = views.post_id) 
    LEFT OUTER JOIN upvotes ON (posts.id = upvotes.post_id) 

GROUP BY posts.id; 

我明白爲什麼它的失敗,但我真的不知道如何去做。如果我需要運行兩個不同的查詢並在應用程序級別彙總結果,那我就沒問題。我只想了解是否可以用單個查詢

我創建了一個sqlfiddle with my test case

PS:我設法使用一個通用表來跟蹤事件,但我希望保持表格分離。 sqlfiddle here

回答

4

您可以安全地計算子查詢中的值。這會避免你總結重複的值,導致你的結果無效。

SELECT p.id, 
     p.title, 
     COALESCE(v.totalView, 0) totalView, 
     COALESCE(u.totalUpvote, 0) totalUpvote 
FROM posts p 
     LEFT JOIN 
     (
      SELECT post_id, 
        SUM(v.value) totalView 
      FROM views v 
      GROUP BY post_id 
     ) v ON p.id = v.post_ID 
     LEFT JOIN 
     (
      SELECT post_id, 
        SUM(u.value) totalUpvote 
      FROM upvotes u 
      GROUP BY post_id 
     ) u ON p.ID = u.post_ID 
1

SQL Fiddle

別2個獨立選擇

SELECT * FROM(SELECT posts.title, 
     SUM(views.value) AS views 
FROM posts 
    LEFT OUTER JOIN views ON (posts.id = views.post_id) 
GROUP BY posts.id)as x 
JOIN(
SELECT posts.title,  
     SUM(upvotes.value) AS upvotes 
FROM posts 
    LEFT OUTER JOIN upvotes ON (posts.id = upvotes.post_id) 
GROUP BY posts.id)as y on x.title=y.title 
之間的JOIN
相關問題