Mysql连接三个表比分组两列

时间:2013-06-12 15:03:39

标签: mysql join group-by

我有三个表t1,t2,t3。 T3与t2和t2与t1有关。 我有这个选择

select t1.id,sum(t3.column)
from 
    t1 
    join t2 on t2.fk = t1.id 
    join t3 on t3.fk = t2.id
where t1.column = 'something'
group by t1.id,t3.fk;

没有组选择有120行。随着

group by t3.fk 
它有5行。 与

group by t1.id it have 1 row

这仍然可以。但如果我有

group by t3.fk,t1.id
它有5行。我预计只有一排。 示例数据:

t1.id    |t1.some_column
5        |"some data"

t2.id    |t2.fk    |t2.some_column
1        |5        |"a"
2        |5        |"b"
3        |5        |"c"
4        |5        |"d"
5        |5        |"e"

t3.id    |t3.fk    |t3.column
1        |1        |1
......................
24       |2        |1
......................
48       |3        |1
......................
72       |3        |1
......................
96       |3        |1
......................

选择退货:

t1.id    |sum(t3.column)
5        |24
5        |24
5        |24
5        |24
5        |24

我无法理解为什么当我按t1.id分组时,有5行具有相同的t1.id。我知道如果它只返回一行,我会丢失关于总和的信息,但它也会在选择中没有总和。我知道这个选择是愚蠢的,没有任何意义,但它可能有助于我更好地理解。

1 个答案:

答案 0 :(得分:1)

我相信你没有向我们提供足够的信息,因为结果毫无意义。

  • group by t2.fk返回5行表示有五个不同的t2.fk
  • group by t1.id返回1行表示只有一个不同的t1.id值。
  • 由于您加入了t2.fk = t1.id,这意味着t2.fk的不同值和t1.id的不同值的数量应该相同,这与之前的结果相矛盾。< / LI>

  

对不起,你是对的。它应该是t3.fk而不是t2.fk.我编辑它   并添加一些数据。 - CoCumis

没有什么难以理解的。假设有t3.fk的5个唯一值,例如[1,2,3,4,5]和t1.id的1个唯一值,如[1],{{1}的组合应该产生5种独特的组合,例如[(1,1),(2,1),(3,1),(4,1),(5,1)]。所以返回5行是预期的。