use*_*053 -4 mysql sql database join
我有 3 张桌子
branch-
br_id,
br_name
users
user_id
user_name
user_type (2 types 'owner' 'admin')
user_branch (associated branch )
user_branches (comma seperated branch ids in case of 'admin' type )
item
it_id
it_amount
it_owner
it_admin
it_activated
Run Code Online (Sandbox Code Playgroud)
这里每个项目都属于用户类型“所有者”
每个项目还与用户类型“admin”相关联
我想要的是分行列表以及相关的总金额和总计数
**Branch** **total** **total amount**
some branch Name 5 500
another Branch Name 7 780
Run Code Online (Sandbox Code Playgroud)
我如何在单个查询中做到这一点
我试过这个显示所有分支的数量
SELECT br_name,
count(it_id),
SUM(it_amount),
FROM branch
LEFT JOIN users ON FIND_IN_SET(br_id,user_branches)>0
LEFT JOIN item ON it_admin=ad_id
WHERE it_activated=1
GROUP BY br_name
Run Code Online (Sandbox Code Playgroud)
但我在所有分支机构的数量和金额都相同
首先,您应该真正提供最低限度,尤其是在询问赏金时。不知道您的表格结构和示例内容会使其他人更难提供帮助。我创建了示例创建表和插入,然后是查询。如果有任何不准确的地方,请纠正我。
CREATE TABLE branch (
br_id int unsigned NOT NULL,
br_name varchar(10) NOT NULL,
PRIMARY KEY (br_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE users (
user_id int unsigned NOT NULL,
user_name varchar(10) NOT NULL,
user_type varchar(10) NOT NULL,
user_branch int NOT NULL,
user_branches varchar(10) NOT NULL,
PRIMARY KEY (user_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE item (
it_id int unsigned NOT NULL,
it_amount int NOT NULL,
it_owner int NOT NULL,
it_admin int NOT NULL,
it_activated int NOT NULL,
PRIMARY KEY (it_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into branch ( br_id, br_name )
values
( 1, 'b1' ),
( 2, 'b2'),
( 3, 'b3' );
insert into users ( user_id, user_name, user_type, user_branch, user_branches )
values
( 1, 'n1', 'owner', 1, '' ),
( 2, 'n2', 'admin', 2, '2, 3' ),
( 3, 'n3', 'owner', 3, '' );
insert into item ( it_id, it_amount, it_owner, it_admin, it_activated )
values
( 1, 100, 1, 2, 1 ),
( 2, 150, 3, 2, 1 ),
( 3, 125, 1, 2, 1 ),
( 4, 30, 3, 2, 0 );
Run Code Online (Sandbox Code Playgroud)
现在,我相信您需要的是一个 UNION 查询,分别涵盖所有者与管理员,否则,您将全面获得双重计数。其次,当您使用逗号分隔的列表来保存某人/某物可以符合条件的多个 ID(例如您的 ADMIN 用户)时,我认为这不是表格设计的最佳布局。但如果这就是你所拥有的并且无法改变它,那就这样吧。
所以,现在开始查询。单独看每一个。如果按 OWNER 类型的用户进行查询,则只加入该用户类型并专门绑定到用户的分支,然后根据项目的所有者绑定到项目表。你得到一个结果。
最后,类似的加入,但仅基于用户的 ADMIN 类型,并根据项目的 ADMIN ID 加入项目。
同样,如果没有您的示例源记录和预期输出,这是我目前能想到的最佳解释(可能还有其他解释)。因此,对于类似列结果结构中的查询,它们可以通过“UNION”组合在一起。我添加了一个额外的列,分别根据所有者/管理员的来源显示数字的来源。
select
b.br_name,
'By Owner' Source,
count(i.it_id) numOfItems,
SUM(i.it_amount) sumOfAmount
FROM
branch b
JOIN Users u
on u.user_type = 'owner'
AND b.br_id = u.user_branch
JOIN Item i
on u.user_id = i.it_owner
AND i.it_activated = 1
group by
b.br_name
UNION
select
b.br_name,
'By Admin' Source,
count(i.it_id) numOfItems,
SUM(i.it_amount) sumOfAmount
FROM
branch b
JOIN Users u
on u.user_type = 'admin'
AND FIND_IN_SET(b.br_id, u.user_branches) > 0
JOIN Item i
on u.user_id = i.it_admin
AND i.it_activated = 1
group by
b.br_name;
Run Code Online (Sandbox Code Playgroud)