MySQL查询帮助(涉及连接?)

时间:2010-01-25 21:48:57

标签: sql mysql join

虽然我已经找到了几个几乎可以做到这一点的查询,但是我不能完全理解它并且我感到很沮丧。这是设置:

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    |

当您将源及其所有dests以及源名称聚合在一起时,结果中的值应该是问题表中值的总和。

一些笔记  (1)source-> dest是一对多关系。  (2)最佳答案在查询中不会有任何硬编码的id或名称(意思是,对于所有这样的设置,它将被推广)。  (3)这是在MySQL

谢谢你,让我知道我是否应该提供更多信息

4 个答案:

答案 0 :(得分: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;

可以工作。

答案 1 :(得分: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

答案 2 :(得分:0)

这个应该返回source和dests的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;

答案 3 :(得分: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