Mysql 从另一个表中选择基于条件if的总和

Mysql 从另一个表中选择基于条件if的总和,mysql,Mysql,数据库:mysql5.0版 table 1: type_id (int), type table 2: name_id, name, is_same_as = table2.name_id or NULL table 3: id, table2.name_id, table1.type_id, value (float) 我想对表3中的值和计数值求和,其中表2.name\u id相同,还包括id中相同\u is=name\u id的值。我想为表2中的所有值选择表3中的所有数据 如果我的问题不是

数据库:
mysql
5.0版

table 1: type_id (int), type
table 2: name_id, name, is_same_as = table2.name_id or NULL
table 3: id, table2.name_id, table1.type_id, value (float)
我想对
表3
中的值和计数值求和,其中
表2.name\u id
相同,还包括
id
相同\u is=name\u id
的值。我想为
表2中的所有值选择
表3
中的所有数据

如果我的问题不是很清楚,并且已经回答了,但我找不到相关的答案,请道歉。或者不知道该找什么

[data]. table1
id | type
=========
1  | test1
2  | test2

[data].table2
name_id  |  name  | is_same_as
==============================
1        |  tb_1  | NULL
2        |  tb_2  | 1
3        |  tb_3  | NULL
4        |  tb_4  | 1

[data].table3
id    |   name_id  |  type_id | value
======================================
1     |   1        |  1       | 1.5
2     |   2        |  1       | 0.5
3     |   2        |  2       | 1.0


output:
name_id| type_id|SUM(value)
=======================================================
1      | 1      |2.0  < because in table2, is_same_as = 1
2      | 2      |1.0
[数据]。表1
id |类型
=========
1 |测试1
2 |测试2
[数据].表2
名称| id |名称|与|相同
==============================
1 | tb|u 1 |空
2 | tb | U 2 | 1
3 | tb | U 3 |空
4 | tb | U 4 | 1
[数据].表3
id |名称| id |类型| id |值
======================================
1     |   1        |  1       | 1.5
2     |   2        |  1       | 0.5
3     |   2        |  2       | 1.0
输出:
名称|类型| id |和(值)
=======================================================
1 | 1 | 2.0<因为在表2中,与=1相同
2      | 2      |1.0

我认为以下内容符合您的要求:

select coalesce(t2.is_same_as, t2.name_id) as name_id, t3.type_id, sum(value)
from table_3 t3 join
     table_2 t2
     on t3.name_id = t2.name_id
group by coalesce(t2.is_same_as, t2.name_id), t3.type_id
order by 1, 2

它加入
name\u id
上的表。但是,它随后使用
列(如果存在)相同,或者
名称id(如果没有)来汇总数据。

这可能就是您要查找的内容:(我没有在MySQL中测试它,所以可能有输入错误)

以下是查询的作用:

首先,它创建了“组合名称”选项卡,这是所有表2行的一个连接,您可以使用“is_same_as”列对这些行进行分组,以进行确定。我确保通过执行联合来包含“parent”行

第二,一旦你有了上面的这些行,它就是一个简单的连接到表3,带有一个GROUPBY和一个SUM

注:表1是不必要的(我相信)

让我知道这是否有效


约翰…

你试过什么?而且,问题真的不是那么清楚。提供一个测试数据集,每个表中至少有2行,并显示希望获得的输出。[数据]。表1 id |类型===========1 | test1 2 | test2[数据]。表2名称| id |名称|与==========================1 | tb | 1 | NULL 2 | tb | 2 | 1 3 | tb | 3 | NULL 4 | 1[数据]第3个表3个id(名称和U id)名为“名称”名为“U id”名为“U id”名为“表3个id”名为“表3个id”名为“表3个id”名为1.3名为1.3名为“U id”名为1.3名为“U id”名为1.3名为“U id”名为3.5 3 3 2个2 4 4 4 4 4 2.2 2 2 2 2 2.1.0输出:1.0输出:名为第1.0输出:名为“U id”名为1.1.0输出:名为“U id”名为1.1.1.1.0.0输出:名为1.1.1.1.1.0输出:名为1.1.1.1.1.0输出:名为“U id名为“U id名为“U id”名为1.1.1.1.1.1.1.1.1.1.1.0====1 | 1 | 2.0<因为在表2中,请在问题中加上这一点,它在注释中是不可读的。为什么在你的结果中name id=2的类型是id=2,而在表3中name id=2的类型是id=1?亚历克斯·蒙蒂:在表3中,name id必须用不同的值键入id取决于你想要的行为,戈登的答案可能更好。他的回答将删除所有“name_id=2”记录,使其不显示自己的结果集行,只需将其值合并到“name_id=1”中即可。我的查询将“name\u id=2”值合并为“name\u id=1”,但也会独立显示“name\u id=2”值。我猜你可能想要戈登的答案。是的,这很有效!我正在对已获得的数据集测试查询。关于此筛选器:sum(value)/count(value)>=3,将其添加到查询末尾的HAVING子句中。请参阅上面的编辑。如果总和(值)/计数(值)>=3,如何仅获取记录
with combined_names_tab (name_id, name_id_ref) as
(
select name_id, name_id from table2
union select t2a.name_id, t2b.name_id
  from table2 t2a 
  join table2 t2b 
    on (t2a.name_id = t2b.is_same_as)
)
select cnt.name_id, t3.type_id, sum(t3.value) sum_val
  from combined_names_tab cnt
  join table3 t3
    on ( cnt.name_id_ref = t3.name_id )
 group by cnt.name_id, t3.type_id
having sum(t3.value) / count(t3.value) >= 3