mysql - mysql查询中多个连接中的where子句
问题描述
我有以下表格:- - 员工 - 订单 - OrderDetails
Employees
+-----------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+--------------+------+-----+---------+-------+
| EmployeeID | int | NO | PRI | NULL | |
| LastName | varchar(20) | YES | | NULL | |
| FirstName | varchar(10) | YES | | NULL | |
| Title | varchar(30) | YES | | NULL | |
| TitleOfCourtesy | varchar(25) | YES | | NULL | |
| BirthDate | datetime | YES | | NULL | |
| HireDate | datetime | YES | | NULL | |
| Address | varchar(60) | YES | | NULL | |
| City | varchar(15) | YES | | NULL | |
| Region | varchar(15) | YES | | NULL | |
| PostalCode | varchar(10) | YES | | NULL | |
| Country | varchar(15) | YES | | NULL | |
| HomePhone | varchar(24) | YES | | NULL | |
| Extension | varchar(4) | YES | | NULL | |
| Notes | mediumtext | YES | | NULL | |
| ReportsTo | int | YES | | NULL | |
| PhotoPath | varchar(255) | YES | | NULL | |
| Salary | float | YES | | NULL | |
+-----------------+--------------+------+-----+---------+-------+
Orders
+----------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------------+---------------+------+-----+---------+-------+
| OrderID | int | NO | PRI | NULL | |
| CustomerID | varchar(5) | YES | | NULL | |
| EmployeeID | int | YES | | NULL | |
| OrderDate | datetime | YES | | NULL | |
| RequiredDate | datetime | YES | | NULL | |
| ShippedDate | datetime | YES | | NULL | |
| ShipVia | int | YES | | NULL | |
| Freight | decimal(10,4) | YES | | NULL | |
| ShipName | varchar(40) | YES | | NULL | |
| ShipAddress | varchar(60) | YES | | NULL | |
| ShipCity | varchar(15) | YES | | NULL | |
| ShipRegion | varchar(15) | YES | | NULL | |
| ShipPostalCode | varchar(10) | YES | | NULL | |
| ShipCountry | varchar(15) | YES | | NULL | |
+----------------+---------------+------+-----+---------+-------+
OrdreDetails
+-----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+---------------+------+-----+---------+-------+
| OrderID | int | YES | MUL | NULL | |
| ProductID | int | YES | MUL | NULL | |
| UnitPrice | decimal(10,4) | YES | | NULL | |
| Quantity | smallint | YES | | NULL | |
| Discount | double | YES | | NULL | |
+-----------+---------------+------+-----+---------+-------+
我的问题是 给出员工的标识符、姓名和总销售额,按员工标识符为已销售 70 多种不同产品的员工排序
我写了这个查询
select t1.EmployeeID as Identifier,
concat(t1.FirstName, ' ', t1.LastName) as Name,
(select count(*) from orders t4 where t4.EmployeeID = identifier) as Total_Sales,
count(distinct(t3.ProductID)) as Total_unique_products
from Employees t1
inner join Orders t2
on t1.EmployeeID = t2.EmployeeID
inner join orderdetails t3
on t2.OrderID = t3.OrderID
group by t1.EmployeeID
order by t1.EmployeeID;
我还想只显示 Total_unique_products 大于 70 的那些;我该怎么做?
解决方案
您需要一个having
子句、concat(t1.FirstName, ' ', t1.LastName)
添加到group by
子句的列和重新格式化count(distinct...)
表达式(内括号是多余的)。
Aleft join
将是更好的选择,因为可能存在不匹配的记录。
不需要相关子查询。所以把你的转换成这个:
select e.EmployeeID as Identifier,
concat(e.FirstName, ' ', e.LastName) as Name,
count(o.ID) as Total_Sales,
count(distinct od.ProductID) as Total_unique_products
from Employees e
left join Orders o
on e.EmployeeID = o.EmployeeID
left join orderdetails od
on o.OrderID = od.OrderID
group by e.EmployeeID, concat(e.FirstName, ' ', e.LastName)
having count(distinct od.ProductID) > 70
order by e.EmployeeID;
推荐阅读
- c# - 如何使用计时器从 Mysql 数据库中检索数据?
- django - 同时编辑一个主题及其子条目
- clio-api - CLIO API - 内部服务器错误 - 创建通信
- typo3 - 在 TYPO3 模板中, v:variable.set 有效...但 f:variable 无效
- generics - 在 Rust 中,如何检查泛型参数是否属于特定类型并将其转换为
- elm - elm init, make, install and stuff inside reactor 因 HTTP 问题而失败
- ios - 如何使用 perform(aSelector: , with: , afterDelay: , inModes: ) 在延迟后暂停 CABasicAnimation
- python - 在 psycopg2 / postgres 命令中使用外部变量
- java - 是否可以在 Java 中替换依赖库的方法的实现?
- php - 从 html 运行 bash 脚本