我如何 'join' 但在 MySQL 的表中将内容分开?
How do I 'join' but keep things separate in tables in MySQL?
我有两个 table。 Table 员工:
EmployeeID (employees) LastName (employees) FirstName (employees)
1 Davolio Nancy
和Table订单:
OrderID (orders) CustomerID (orders) EmployeeID (orders)
10248 90 5
10278 45 1
10238 47 1
我编辑了完整列表,因为它有数百行。
在table个Employees中,EmployeeID可以唯一标识一个员工,也就是说在table个Employee中不会重复。但是在 Table 'Order' 中,employeeID 可以重复多次,因为一个员工可以为很多订单提供帮助。
无论如何,我可以在这里看到,在订单 table 中,一个 employeeID 会重复多次,这意味着我需要在我的 MySQL 代码中的某处使用 COUNT(EmployeeID)>=2 .
这就是我想要的:
EmployeeID Number of Orders
1 2
如您所见,EmployeeID 在“订单”中出现了两次 table。所以他卖了 2 件商品,它链接到他的 1 个员工 ID。
所以这是我尝试过的:
SELECT EmployeeID, COUNT(EmployeeID) FROM
employees A inner join
orders B
ON (A.EmployeeID=B.EmployeeID)
WHERE COUNT(B.EmployeeID >=2)
这是输出:
错误:字段列表中的列 'EmployeeID' 不明确 — 错误代码 1052
我不确定在这种情况下如何得到这个结果。
您想要构建属于同一员工的订单组,然后过滤每组的行数。为此,您可以使用 group by
和 having
:
select employeeid, count(*) cnt_orders
from employees e
inner join orders o using(employeeid)
group by employeeid
having count(*) >= 2
请注意,此处不需要连接。您可以直接从订单的table中得到您想要的结果:
select employeeid, count(*) cnt_orders
from orders
group by employeeid
having count(*) >= 2
不需要加入employees
table,可以从orders
获取员工ID。只有当您还需要来自 employee
table 的其他信息(例如他们的姓名)时,您才需要加入。
您需要 GROUP BY employeeID
来计算每位员工的数量。
>= 2
不应该在COUNT()
函数里面,你要比较结果。
您需要使用 HAVING
而不是 WHERE
。 WHERE
用于 select 在 聚合之前处理 行。
您应该使用 COUNT(*)
而不是 COUNT(columnName)
除非您需要从计数中排除该列的空值。
如果您为 COUNT(*)
结果指定别名,则可以在 HAVING
子句中使用该别名,而不是重新声明函数。
SELECT EmployeeID, COUNT(*) AS number_of_orders
FROM orders B
GROUP BY EmployeeID
HAVING number_of_orders >= 2
关于不明确列的错误原因是因为两个 table 都有 EmployeeID
列。在 SELECT
列表中,您需要指定 A.EmployeeID
或 B.EmployeeID
,就像您在 ON
子句中所做的那样。
我有两个 table。 Table 员工:
EmployeeID (employees) LastName (employees) FirstName (employees)
1 Davolio Nancy
和Table订单:
OrderID (orders) CustomerID (orders) EmployeeID (orders)
10248 90 5
10278 45 1
10238 47 1
我编辑了完整列表,因为它有数百行。
在table个Employees中,EmployeeID可以唯一标识一个员工,也就是说在table个Employee中不会重复。但是在 Table 'Order' 中,employeeID 可以重复多次,因为一个员工可以为很多订单提供帮助。
无论如何,我可以在这里看到,在订单 table 中,一个 employeeID 会重复多次,这意味着我需要在我的 MySQL 代码中的某处使用 COUNT(EmployeeID)>=2 .
这就是我想要的:
EmployeeID Number of Orders
1 2
如您所见,EmployeeID 在“订单”中出现了两次 table。所以他卖了 2 件商品,它链接到他的 1 个员工 ID。
所以这是我尝试过的:
SELECT EmployeeID, COUNT(EmployeeID) FROM
employees A inner join
orders B
ON (A.EmployeeID=B.EmployeeID)
WHERE COUNT(B.EmployeeID >=2)
这是输出:
错误:字段列表中的列 'EmployeeID' 不明确 — 错误代码 1052
我不确定在这种情况下如何得到这个结果。
您想要构建属于同一员工的订单组,然后过滤每组的行数。为此,您可以使用 group by
和 having
:
select employeeid, count(*) cnt_orders
from employees e
inner join orders o using(employeeid)
group by employeeid
having count(*) >= 2
请注意,此处不需要连接。您可以直接从订单的table中得到您想要的结果:
select employeeid, count(*) cnt_orders
from orders
group by employeeid
having count(*) >= 2
不需要加入employees
table,可以从orders
获取员工ID。只有当您还需要来自 employee
table 的其他信息(例如他们的姓名)时,您才需要加入。
您需要 GROUP BY employeeID
来计算每位员工的数量。
>= 2
不应该在COUNT()
函数里面,你要比较结果。
您需要使用 HAVING
而不是 WHERE
。 WHERE
用于 select 在 聚合之前处理 行。
您应该使用 COUNT(*)
而不是 COUNT(columnName)
除非您需要从计数中排除该列的空值。
如果您为 COUNT(*)
结果指定别名,则可以在 HAVING
子句中使用该别名,而不是重新声明函数。
SELECT EmployeeID, COUNT(*) AS number_of_orders
FROM orders B
GROUP BY EmployeeID
HAVING number_of_orders >= 2
关于不明确列的错误原因是因为两个 table 都有 EmployeeID
列。在 SELECT
列表中,您需要指定 A.EmployeeID
或 B.EmployeeID
,就像您在 ON
子句中所做的那样。