mysql - 如何连接三个表,添加两个表中的两个单独的字段,然后最后按两个表中的两个单独的字段进行分组

标签 mysql

我有三个表 admins,table2,table3

管理员结构是

admins_id  | admin_name | admin_username
1          | ABC        |1234
2          | Cde        |456

表2结构为

table2mask |table2adminid | table2maskcount
mask1      |1              |30
mask2      |1              |60

table3结构为

table3mask |table3adminid | table3maskcount
mask1      |1              |30
mask2      |1              |70
mask3      |2              |10

我想要实现的是

username   | mask        |ttlCount
1234       | mask1       | 60
1234       | mask2       | 130
456        | mask3       | 10

我应该如何实现这个目标

我尝试使用下面给出的查询

SELECT admins.`admin_username`, 
(table2.`table2maskcount`+table3.`table3maskcount`) AS ttl_counts from 
admins inner join table2 on table2.`table2adminid` = admins.`admin_id` inner 
join table3 on table3.`table3adminid` = admins.`admin_id` Where 
table2.`table2mask`=table3.`table3mask`

但它没有给我准确的结果,它没有显示仅在任一表中可用的掩码计数

最佳答案

admins加入到其他2个表的并集,group by adminmask并聚合:

select a.admin_username username, t.mask, sum(maskcount) ttlcount
from admins a inner join (
  select 
    table2mask mask, 
    table2adminid adminid, 
    table2maskcount maskcount 
  from table2
  union all
  select * from table3
) t on t.adminid = a.admins_id 
group by a.admins_id, a.admin_username, t.mask

参见 demo
结果:

| username | mask  | ttlcount |
| -------- | ----- | -------- |
| 1234     | mask1 | 60       |
| 1234     | mask2 | 130      |
| 456      | mask3 | 10       |

关于mysql - 如何连接三个表,添加两个表中的两个单独的字段,然后最后按两个表中的两个单独的字段进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59211863/

相关文章:

mysql - Solr 和 MySQL,如何保持更新的索引,如果它很简单,是否还需要数据库?

mysql - 从mysql查询获取子节点数

c# - Entity Framework 查询忽略我的 orderby

PHP - 每周显示 1 条随机记录

php - Mysql 和 PHP 中 null 值变为 0

PHP Foreach 一个带有返回值的函数并插入到数据库中

mysql - 数据库设计 - "Separate Tables Vs One table"用于选择查询

mysql - 如何避免 GROUP_CONCAT() 行乘以我的 SUM()

Mysql为什么12.3 < 12.3是真的

mysql - 使用 PHP Admin 在 AWS 上连接并创建 MySql 数据库