2010-11-25 52 views
1

這個問題可能已經問了很多次,所以,請原諒我的重複,但我似乎無法找到像這樣的東西,也不能設法建立類似於我的東西想要實現。MySQL加入SUM

例如,可以說,我有以下表結構:

//tasks 
+-------+--------------+------+-----+---------+-------+ 
| Field | Type   | Null | Key | Default | Extra | 
+-------+--------------+------+-----+---------+-------+ 
| id | int(11)  | NO | P | None | AI | 
| user | int(11)  | NO |  | None |  | 
| data | varchar(200) | NO |  | None |  | 
+-------+--------------+------+-----+---------+-------+ 

//votes 
+-------+--------------+------+-----+---------+-------+ 
| Field | Type   | Null | Key | Default | Extra | 
+-------+--------------+------+-----+---------+-------+ 
| id | int(11)  | NO | P |   | AI | 
| user | int(11)  | NO |  |   |  | 
| item | int(11)  | NO |  |   |  | 
| up | tinyint(1) | NO |  | 0  |  | 
| down | tinyint(1) | NO |  | 0  |  | 
+-------+--------------+------+-----+---------+-------+ 

數據如下:

//tasks 
+----+------+------------+ 
| id | user | data | 
+----+------+------------+ 
| 1 | 1 | something | 
| 2 | 2 | lorem ip | 
| 3 | 1 | biggy | 
+----+------+------------+ 

//votes 
+----+------+------+----+------+ 
| id | user | item | up | down | 
+----+------+------+----+------+ 
| 1 | 8 | 1 | 1 | 0 | 
| 2 | 4 | 1 | 1 | 0 | 
| 3 | 2 | 1 | 0 | 1 | 
| 4 | 2 | 2 | 1 | 0 | 
| 5 | 1 | 2 | 1 | 0 | 
+----+------+------+----+------+ 

我想要做類似的東西:

SELECT r.* FROM `tasks` WHERE `user` = '1' r 
LEFT JOIN (SELECT SUM(t.up) AS up, 
        SUM(t.down) AS down 
      FROM `votes` t 
      WHERE t.item = r.id) r ON r.id = t.item 

是的,這是我的查詢到目前爲止,但它不起作用,我不知道如何糾正。

基本上,我想:

  1. 選擇一切從表任務其中user爲 「x」
  2. 任務加入每一行(在步驟1中選擇)與總和的up,總和down來自表其中item等於id任務

這應該產生類似的信息(即。 user = 1):

+----+------+------------+----+------+ 
| id | user | data | up | down | 
+----+------+------------+----+------+ 
| 1 | 1 | something | 3 | 1 | 
| 3 | 1 | biggy | 0 | 0 | 
+----+------+------------+----+------+ 

好了,我希望你們瞭解並能幫助我。

在此先感謝!

回答

4

WHERE子句需要低於連接,應使用AS聲明別名。這是您的查詢的(語法)修正版本:

SELECT r.* 
    FROM `tasks` 
LEFT JOIN (
      SELECT SUM(t.up) AS up, 
        SUM(t.down) AS down 
       FROM `votes` AS t 
       WHERE t.item = r.id 
     ) AS r 
     ON r.id = t.item 
    WHERE `user` = '1' 

這是我怎麼會做(未經測試):

SELECT `tasks`.`id`, 
      `tasks`.`user`, 
      `tasks`.`data`, 
      `votes`.`up`, 
      `votes`.`down` 
    FROM `tasks` 
LEFT JOIN (
       SELECT `item`, 
         SUM(`up`) AS `up`, 
         SUM(`down`) AS `down` 
       FROM `votes` 
      GROUP BY `item` 
     ) AS `votes` 
     ON `votes`.`item` = `tasks`.`id` 
    WHERE `tasks`.`user` = 1 
+0

事實上這是行不通的,這裏的錯誤:`#1054 - 未知列「,其中clause'`,看起來像線'其中T 'r.id'。 item = r.id`。據我的理解,這是在JOIN之後設置`r`的問題......如果我錯了,請糾正我,只是試圖從所有這些中學習。 – jolt 2010-11-25 18:31:00

+0

@Tom:你的猜測是正確的。試試我的第二個版本。 – jwueller 2010-11-25 18:40:26

2

讓我們看看我的代碼是這樣的:

SELECT t.id, t.user, t.data, ifnull(u.total, 0) as up, ifnull(d.total, 0) as down 
FROM 
    tasks AS t LEFT OUTER JOIN (
     SELECT item, SUM(up) AS total FROM votes GROUP BY item 
    ) AS u ON t.id = u.item LEFT OUTER JOIN (
     SELECT item, SUM(down) AS total FROM votes GROUP BY item 
    ) AS d ON t.id = u.item 
WHERE t.user = 1; 

然後用於顯示單行既總計可以嘗試:

SELECT t.id, t.user, t.data, 
    ifnull((SELECT SUM(up) FROM votes GROUP BY item WHERE item = t.id), 0) AS up, 
    ifnull((SELECT SUM(down) FROM votes GROUP BY item WHERE item = t.id), 0) AS down 
FROM tasks AS t 
WHERE t.user = 1; 

或者試試這個:

SELECT t.id, t.user, t.data, IFNULL(tt.up, 0) AS up, IFNULL(tt.down, 0) AS down 
FROM 
    tasks AS t LEFT OUTER JOIN (
     SELECT item, SUM(up) AS up, SUM(down) AS down 
     FROM votes 
     GROUP BY item 
    ) AS tt ON t.id = tt.item 
WHERE t.user = 1