Mysql 在子查询中检索筛选值的SQL

Mysql 在子查询中检索筛选值的SQL,mysql,sql,count,group-by,having,Mysql,Sql,Count,Group By,Having,在这种情况下,cust_id是一个外键,ords返回每个客户的订单数量 SELECT cust_name, ( SELECT COUNT(*) FROM Orders WHERE Orders.cust_id = Customers.cust_id ) AS ords FROM Customers 输出是正确的,但我想对其进行过滤,以仅检索订单量小于给定数量的客户,我不知道如何过滤子查询词,我尝试在代码末尾的地方使用小于2的词,但不起作用,我尝试添加和计数*使用HAVI

在这种情况下,cust_id是一个外键,ords返回每个客户的订单数量

SELECT cust_name, (
    SELECT COUNT(*)
    FROM Orders
    WHERE Orders.cust_id = Customers.cust_id
) AS ords
FROM Customers

输出是正确的,但我想对其进行过滤,以仅检索订单量小于给定数量的客户,我不知道如何过滤子查询词,我尝试在代码末尾的地方使用小于2的词,但不起作用,我尝试添加和计数*使用HAVING子句,并使用联接而不是子查询

SELECT Customers.cust_id, Customers.cust_name, COUNT(*) ords
FROM Orders, Customers 
WHERE Orders.cust_id = Customers.cust_id
GROUP BY 1,2
HAVING COUNT(*)<2

如果要包含订单为零的人员,请将联接更改为外部联接。

此处不需要相关子查询,因为它会计算每一行的值,而这不会提供良好的性能。更好的方法是使用带有连接、GROUPBY和having子句的常规查询将条件应用于组

因为您的条件是只返回少于2个订单的客户,所以左连接而不是内部连接是合适的。它将返回没有订单且计数为0的客户

select
  cust_name, count(*)
from
  customers c
  left join orders o on c.cust_id = o.cust_id
group by cust_name
having count(*) < 2

客户名称不太可能要求是唯一的。您可能有两个客户都叫Joe,因此仅按名称分组是不好的,会产生错误的结果。您怎么可能知道OP的数据?为什么您认为该值不可能是唯一的?这可能是一家公司的全名,我觉得它有点独特。无论如何,您不知道数据模型:我不知道这是为什么我说不可能-但在大多数规范化数据模型中,名称不要求是唯一的,这就是连接使用id的原因。嵌套查询没有这个问题,因为它在外部表扫描上使用id而没有任何聚合,然而,将其更改为连接将改变这种语义——最终,了解数据库设计的人将不得不调用什么是安全的。