mysql 中有 3 个表的多个连接

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)

但我在所有分支机构的数量和金额都相同

DRa*_*app 5

首先,您应该真正提供最低限度,尤其是在询问赏金时。不知道您的表格结构和示例内容会使其他人更难提供帮助。我创建了示例创建表和插入,然后是查询。如果有任何不准确的地方,请纠正我。

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)