2012-12-04 61 views
0

我在MySQL數據庫結構如下表「C」:將相關記錄多對多表中的MySQL

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, - 對於Object1Id = 3和Object2Id = 1

我想的結果總結如下:1,3,6

我怎樣才能產生所需的結果?

謝謝。

+0

可以ü格式化您的代碼pls,沒有人可以閱讀這個 –

回答

0

首先,我會簡化查詢到

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

您的查詢不工作,因爲你有列object1idobject2id和重用這些名稱將結果列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測試

+0

謝謝!這是完美的作品... – Shpongle

0

是的!

SELECT Object1Id, Object2Id, sum(OccuranceCount) 
FROM (

__ YOUR SELECT __ 

) foo 
+0

請添加一些解釋性文字,使這個答案有用 - 謝謝。 –

+0

這也可以工作。但我會與奧拉夫的回答一起去。感謝您的幫助。 – Shpongle

相關問題