【问题标题】:MySQL how to sum subgroup first then sum totalMySQL如何先对子组求和然后求和
【发布时间】:2013-10-24 09:52:14
【问题描述】:

我在table_1table_2 中的数据。

table_1

id  id_1 num   ids_2
1   3    33    666,777,888
2   3    333   6666,7777,8888
3   4    44    111,222,333
4   4    444   1111,2222,3333

table_2

id_2   num
111    1
222    2
333    3
1111   1
2222   2
3333   3
666    6
777    7
888    8
6666   6
7777   7
8888   8

我只知道如何做我想做的两步:

要获得的第一个 LEFT JOIN:

SELECT t1.id_1, sum(t2.num) 
FROM table_1 AS t1 
LEFT JOIN table_2 AS t2 
ON FIND_IN_SET(t2.id_2, t1.ids_2) 
GROUP BY t1.id_1;

id_1 sum(t2.num)
3    6+7+8+6+7+8
4    1+2+3+1+2+3

然后 LEFT JOIN 与 table_1 再次 sum(table_1.num)+sum(table_2.num):

id_1 sum(table_1.num)+sum(table_2.num)
3    6+7+8+6+7+8+33+333
4    1+2+3+1+2+3+44+444

我可以只用一个 SQL 来做吗?

【问题讨论】:

  • 是的,您只需一个 SQL 即可完成
  • Table_1id_1num 的组合是唯一的????
  • table_1 中还有另一个唯一字段,例如 id(table_1 已更新)。
  • 现在我的问题是,在 (id_1,num) 列中是否存在多个 (3,33) 条目?
  • 不,没有。 (id_1, num) 的组合是唯一的。

标签: mysql sql


【解决方案1】:

Here is the SQLFIddel Demo

以下是您可以尝试的查询

SELECT A.id_1, sum(B.num)+sum(distinct A.num)
  FROM table_1 AS A 
  LEFT JOIN table_2 AS B
    on FIND_IN_SET(B.id_2, A.ids_2) 
 GROUP BY A.id_1;

【讨论】:

    【解决方案2】:

    灵感来自:How to count items in comma separated list MySQL

    SELECT t1.id_1,
      SUM(t1.num / (LENGTH(t1.ids_2) - LENGTH(REPLACE(t1.ids_2, ',', '')) + 1) + t2.num)
        AS total
      FROM table_1 AS t1
      LEFT JOIN table_2 AS t2
        ON FIND_IN_SET(t2.id_2, t1.ids_2) 
      GROUP BY t1.id_1;
    

    如果没有上述除法,结果是:

    id_1 total
    3    6+7+8 + 6+7+8 + 33+33+33 + 333+333+333
    4    1+2+3 + 1+2+3 + 44+44+44 + 444+444+444
    

    有了除法,结果就是我想要的:

    id_1 total
    3    6+7+8 + 6+7+8 + 33/3+33/3+33/3 + 333/3+333/3+333/3
    4    1+2+3 + 1+2+3 + 44/3+44/3+44/3 + 444/3+444/3+444/3
    

    【讨论】:

    • 看我的回答,我认为更好的解决方案。
    猜你喜欢
    • 2021-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多