【问题标题】:Where clause in multiple joins in mysql querymysql查询中多个连接中的where子句
【发布时间】:2023-04-01 07:29:02
【问题描述】:

我有以下表格:- - 雇员 - 订单 - 订单详情

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 的那些; 我该怎么做?

【问题讨论】:

标签: mysql sql


【解决方案1】:

您需要一个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;

【讨论】:

  • 太棒了,还有一件事,为什么你也按名称分组,按ID分组还不够吗?
  • 不错。通常,对于大多数 DBMS,任何非聚合列都应该添加到 GROUP BY 列表中。除非启用了 ONLY_FULL_GROUP_BY,否则 Mysql 会给出异常 @PratyakshSaini 。
【解决方案2】:

主要使用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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多