PHP SQL查询中的UNION,SUM和count(*)一起

所以我有php SQL查询,用于查询楼层和每个楼层的总工作站。

config_location_workstation  workstation          asset_inventory

floor                        floor                floor
workstation_number           workstation_number   workstation_number
workstation_name             assigned_user
(production|non-production)  machine_type

我有config_location_workstation表,该表由楼层,工作站编号,工作站名称(生产,非生产)组成。

然后,我有asset_workstation表,该表由floor,workstation_number,assigned_user,machine_type(笔记本电脑,台式机)组成。 workshop_number具有每个楼层的所有用户工作站号。

我还有asset_inventory表,其中也包含每台机器的楼层和工作站编号。

我能够查询每个楼层的工作站总数。但是我还需要提取所有带有“生产”的workstation_name。我需要合并所有表以产生一个查询,以获取每个工作站的总数量,部署到每个楼层的机器以及每个楼层的总人数。我需要获取每个工作站名(生产,非生产)的所有用户工作站号的计数。

这是当前我要整理地板和整个工作站的代码。

$query=mysqli_query($conn,"SELECT workstation.floor,COUNT(*) TOTAL FROM ( SELECT floor FROM config_location_workstation UNION ALL SELECT floor FROM asset_workstation ) AS workstation GROUP BY floor ORDER BY floor");

我希望输出

+-------+-------------+------+------+------+------+-----+
| Floor | Head Count  | Workstations| Machines Deployed |
+-------+-------------+------+------+------+------+-----+
| 6TH   | 100         | 150         | 140               |
| 18TH  | 200         | 250         | 200               |
| 19TH  | 300         | 320         | 310               |
+-------+-------------+------+------+------+------+-----+

我将如何在一个查询中做到这一点。

shangguan1 回答:PHP SQL查询中的UNION,SUM和count(*)一起

您的表未规范化:所有3个表中似乎都有重复的信息。 (除非workstation_number不是唯一的,并且floor / workstation_number是复合键。对此我建议不要这样做……)

我建议使用类似的架构(假设用户和工作站之间存在多对多关系):

Workstation              User_Workstation     User
id                 <- -  workstation_id     
workstation_number       user_id         - -> id
machine_type                                  name
name
floor

Workstation中的每个字段都描述了工作站的属性。您从其他两个表中收集的任何信息现在都放在一个位置。 不要重复自己! 重复的数据是邪恶

目标是

  

我需要合并所有表以产生一个查询以获取

     
      
  • 每个工作站的总数
  •   
  • 部署到每个楼层的机器
  •   
  • 每层总人数。
  •   
  • 我需要获取每个stationary_name(生产,非生产)的所有用户工作站数量的计数。
  •   

这些都是小菜一碟。 (而且,如果您正在运行脚本来获取结果,这就是您所需要的一切)

select count(id) number_of_workstations
from Workstation;

select count(id) workstations_per_floor,floor
from Workstation
group by floor

select count(u.id) users_per_floor,floor
from Workstation w
inner join User_Workstation uw on w.id = uw.workstation_id
inner join User u on u.id = uw.user_id
-- optionally filter by production or non-production
-- where w.name = ?
group by w.floor

但是您想要的结果似乎有所不同:

+-------+-------------+------+------+------+------+-----+
| Floor | Head Count  | Workstations| Machines Deployed |
+-------+-------------+------+------+------+------+-----+
| 6TH   | 100         | 150         | 140               |
| 18TH  | 200         | 250         | 200               |
| 19TH  | 300         | 320         | 310               |
+-------+-------------+------+------+------+------+-----+

我猜测Head Count是每个楼层的用户数,Workstations是每个楼层的总工作站,而Machines Deployed是...我不知道。生产吗?

select floor,count(u.id) Head_Count,count(distinct w.id) Workstations,-- ??? as Machines_Deployed
from workstation w
left join user_workstation uw on w.id = uw.workstation_id
left join user on u.id = uw.user_id
group by w.floor

(我将根据对Machines Deployed是什么的反馈来对此进行修改)

本文链接:https://www.f2er.com/3134799.html

大家都在问