0

我在 MySQL db 中有一个表'C',其结构如下:

Object1Id (int) - PK并且与表“A”具有一对多关系,

Object2Id (int) - PK并且与表“A”有一对多的关系,

OccuranceId (int) - FK并且与表“B”具有一对多的关系。

基本上,表“C”与表“A”具有多对多关系,与表“B”具有一对多关系。

数据:

1, 3, 1
1, 3, 39
3, 1, 402
3, 1, 27
1, 3, 40
3, 1, 12

我尝试使用查询对记录进行分组:

SELECT CASE WHEN least(Object1Id, Object2Id) = Object1Id THEN Object1Id ELSE Object2Id END AS Object1Id, 
       CASE WHEN Greatest(Object1Id, Object2Id) = Object2Id THEN Object2Id ELSE Object1Id END AS Object2Id, 
       count(OccuranceId) AS OccuranceCount
FROM 'C'
GROUP BY Object1Id, Object2Id

我从查询中得到的结果是:

1、3、3 - 对于 object1Id = 1 和 Object2Id = 3

1、3、3 - 对于 Object1Id = 3 和 Object2Id = 1

我希望结果总结为:1、3、6

我怎样才能产生想要的结果?

谢谢。

4

2 回答 2

0

是的!

SELECT Object1Id, Object2Id, sum(OccuranceCount)
FROM (

__ YOUR SELECT __

) foo 
于 2012-12-04T09:12:15.030 回答
0

首先,我将查询简化为

SELECT least(Object1Id, Object2Id) AS Object1Id,
       Greatest(Object1Id, Object2Id) AS Object2Id,
       count(OccuranceId) AS OccuranceCount
FROM C
GROUP BY Object1Id, Object2Id

您的查询不起作用,因为您有列object1id并且object2id将这些名称重用于结果列least()greatest(). 但是group by子句按表列分组,而不是您的结果列。当您将结果列重命名为其他名称时,它会按预期工作

SELECT least(Object1Id, Object2Id) AS least_val,
       Greatest(Object1Id, Object2Id) AS greatest_val,
       count(OccuranceId) AS OccuranceCount
FROM C
GROUP BY least_val, greatest_val

用于测试的SQL Fiddle

于 2012-12-04T09:10:26.670 回答