mysql - 从 4 个表 mysql 中选择每个用户权限和页面的计数

标签 mysql sql join count multi-query

这可能很容易,但我没有足够的 mysql 经验,我有四个表:

  • 员工
  • 用户
  • 特权
  • 页面

我想从这四个表中选择以下内容:

  • 员工姓名
  • 用户 ID
  • 计数(权限)
  • 计数(页)

所以我希望我的查询显示每个员工的用户名、授予的用户权限数以及用户创建的页面数 我的表结构如下:

CREATE TABLE IF NOT EXISTS `employee` (
  `ID` int(11) NOT NULL,
  `EMP_ENG_NAME_P1` varchar(15) DEFAULT NULL,
  `EMP_ENG_NAME_P2` varchar(15) DEFAULT NULL,) 
ALTER TABLE `employee`ADD PRIMARY KEY (`ID`);

CREATE TABLE IF NOT EXISTS `users` (
  `ID` int(11) NOT NULL,
  `USER_ID` varchar(30) DEFAULT NULL,
  `USER_EMP` int(11) DEFAULT NULL,) 
ALTER TABLE `users`ADD PRIMARY KEY (`ID`), 
  ADD UNIQUE KEY `USER_ID` (`USER_ID`), 
  ADD KEY `users_ibfk_1` (`USER_EMP`);

CREATE TABLE IF NOT EXISTS `privileg` (
  `ID` int(11) NOT NULL,
  `USER_ID` int(11) DEFAULT NULL,
  `PAGE_ID` int(11) DEFAULT NULL,)
ALTER TABLE `privileg`ADD PRIMARY KEY (`ID`);
ALTER TABLE `privileg` ADD CONSTRAINT `privileg_ibfk_2` 
  FOREIGN KEY (`USER_ID`) REFERENCES `users` (`ID`) 
  ON DELETE CASCADE ON UPDATE CASCADE;

CREATE TABLE IF NOT EXISTS `pages` (
  `ID` int(11) NOT NULL,
  `userCreatorID` int(11) DEFAULT NULL,
  `PAGE_ENG_DESC` varchar(100) DEFAULT NULL,)

我能够构建两个查询,显示相同的结果,一次使用每个用户的权限计数,一次使用每个用户的页面计数 第一个查询:

select employee.EMP_ENG_NAME_P1, employee.EMP_ENG_NAME_P2, users.USER_ID, COUNT(privileg.ID)
from employee
  INNER JOIN users on users.USER_EMP = employee.EMP_ID
  INNER JOIN privileg on users.ID= privileg.USER_ID
GROUP BY users.ID 

第二个查询:

select employee.EMP_ENG_NAME_P1, employee.EMP_ENG_NAME_P2, users.USER_ID, users.ID, COUNT(pages.ID)
from employee
  INNER JOIN users on users.USER_EMP = employee.EMP_ID
  INNER JOIN pages on users.ID = pages.userCreatorID
GROUP BY users.ID

我现在需要的是将它们组合在一起,如下图 enter image description here 我使用以下查询:

select employee.EMP_ENG_NAME_P1,employee.EMP_ENG_NAME_P2, users.USER_ID, users.ID, COUNT(pages.ID), COUNT(privileg.ID) 
from employee 
INNER JOIN users on users.USER_EMP=employee.EMP_ID 
INNER JOIN privileg on users.ID= privileg.USER_ID 
INNER JOIN pages on users.ID= pages.userCreatorID 
GROUP BY users.ID

但是计数结果不正确,是相乘的

有什么想法吗?

最佳答案

尝试一下-

SELECT emp.EMP_ENG_NAME_P1, emp.EMP_ENG_NAME_P2, usr.USER_ID, COUNT(DISTINCT prv.ID), COUNT(DISTINCT pgs.id)
FROM employee emp 
INNER JOIN users usr ON usr.USER_EMP = emp.EMP_ID 
INNER JOIN privileg prv ON usr.ID= prv.USER_ID 
INNER JOIN pages pgs ON usr.ID= pgs.UserCreatorID  
GROUP BY users.ID 

关于mysql - 从 4 个表 mysql 中选择每个用户权限和页面的计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31243514/

相关文章:

mysql - 获取行数在内连接 rails 范围内

php - 从 PHP 进行 MySQL 查找?

sql - SQL 中的空字 rune 字是什么?

sql-server - 在空表上运行具有多个联接的查询时,SQL Server 挂起

sql - 具有多个连接的sql中的case语句

sql - 两次连接表 - 在同一个表的两个不同列上

php - 使用求和函数时,我的查询返回单条记录

mysql - SED 查找和替换 - MapReduce 文件

sql - MS Access 2003 中 IN 子句中的元组

php - Mysql 近距离查询