2010-01-25 81 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