2010-01-25 71 views
2

雖然我已經找出了幾個幾乎可以做到這一點的查詢,但我無法完全理解,並且感到沮喪。設置如下:MySQL查詢幫助(涉及連接?)

Table: Issue 
| id | name | value | 
+-------------------+ 
| 1 | a | 10 | 
| 2 | b | 3 | 
| 3 | c | 4 | 
| 4 | d | 9 | 

Table: Link 
| source | dest | 
+---------------+ 
| 1 | 2 | 
| 1 | 3 | 

鏈接表設置問題表中的行之間的源/目標關係。是的,我知道這是非常標準化的,但我沒有創建此架構,即使我現在已經寫對其進行查詢:(

我要的是結果是這個樣子:

| name | value | 
+--------------+ 
| a | 17 | 
| d | 9 | 

結果中的值應該是問題表中當您將源與其所有目標以及源名稱彙總在一起時的值的總和。

一些註釋 (1)source-> dest是一對多關係 (2)最佳答案在查詢中不會有任何硬編碼的ID或名稱(意思是,對於像這樣的所有設置,它將被推廣)。 (3)這是在MySQL

謝謝你,讓我知道我是否應該包含更多的信息

+0

我不明白的源/目標的關係.. 。 – 2010-01-25 21:54:28

+0

你有什麼版本的MySQL。最新版本支持SubQuery和存儲過程,但不是所有這些,所以知道這一點很重要。 – 2010-01-25 21:56:25

+0

@ d03boy:這意味着a與b有關,也就是c,所以它是a,b和c的和。 – 2010-01-25 21:57:24

回答

2

它相當簡單,但堅持己見的事實是,A不是A的目的地卻是包括在表中。在強大的解決方案將涉及修改數據添加

Table: Link 
| source | dest | 
+---------------+ 
| 1 | 1 | 
| 1 | 2 | 
| 1 | 3 | 

那麼簡單

SELECT a.name, SUM(d.value) FROM 
Issues as a 
JOIN Link as b on a.id=b.source 
JOIN Issues AS d on b.dest=d.id; 
GROUP BY a.name; 

如果您不能修改數據。

SELECT a.name, SUM(d.value)+a.value FROM 
Issues as a 
JOIN Link as b on a.id=b.source 
JOIN Issues AS d on b.dest=d.id; 
GROUP BY a.name,a.value; 

可以工作。

2
SELECT S.name, S.value + SUM(D.value) as value 
FROM Link AS L 
    LEFT JOIN Issue AS S ON L.source = S.id 
    LEFT JOIN Issue AS D ON L.dest = D.id 
GROUP BY S.name 
+1

我認爲只有字段可以選擇在GROUP BY子句中?它不應該是'GROUP BY S.name'或'SELECT L.source'嗎? – 2010-01-25 21:57:46

+0

這一個是缺少來源的價值,如果我理解這個問題... – 2010-01-25 22:00:14

+0

@Felix - 沒有,你可以沒有選擇它分組.. – 2010-01-25 22:05:56

0

這個應該返回源和目標的SUM,只返回源的項目。

SELECT s.name, COALESCE(SUM(d.value), 0) + s.value value 
FROM Issue s 
LEFT JOIN Link l ON (l.source = s.id) 
LEFT JOIN Issue d ON (d.id = l.dest) 
WHERE s.id NOT IN (SELECT dest FROM Link) 
GROUP BY s.name, s.value 
ORDER BY s.name; 
+0

但是,結果需要包含不是來源的項目:/ – John 2010-01-25 22:11:03

+0

編輯後的版本返回預期結果中定義的行。 – 2010-01-26 10:34:34

0

你可以使用一個雙聯接查找所有鏈接行,並添加sum到源行本身的價值:

select  src.name, src.value + sum(dest.value) 
from  Issue src 
left join Link l 
on   l.source = src.id 
left join Link dest 
on   dest.id = l.dest 
group by src.name, src.value