[英]Where clause in multiple joins in mysql query
我有以下表格:- - 員工 - 訂單 - 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...)
表達式(內括號是多余的)。
left 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;
主要使用where
過濾特定員工,也使用having
過濾 Total_unique_products 大於 70 的記錄
select
t1.EmployeeID as Identifier,
concat(t1.FirstName, ' ', t1.LastName) as Name,
count(t2.OrderID) 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
where t2.EmployeeID = identifier
group by t1.EmployeeID
having count(distinct(t3.ProductID)) >70
order by t1.EmployeeID;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.