MySQL的 - 两个表查询,用SUM

问题描述:

问题解决MySQL的 - 两个表查询,用SUM

我有两个表,订单和客户,我想找到所有的客户订单,其中大于0

我目前使用两个查询:

SELECT * FROM customers 

SELECT count(id) 
FROM orders 
WHERE customer='CUSTOMER_VALUE' 
AND siteid='siteid' 

我想把它变成一个查询,因此它可以找到所有客户在商店中放置一个或多个订单的位置。

我尝试以下,但它不工作:

SELECT c.*, 
     COUNT(o.customer) AS numOrders 
FROM customers c, 
    orders o 
WHERE o.siteid= 'calico' 
AND o.customer=c.email 

(只给出一个结果,这是客户ID 1)。

我只需要从customers表中找到订单值和一些值。

客户订单中的客户字段和客户ID字段的值相同(即订单1由客户5放置,客户ID 5为“John”)。

有没有办法做到这一点?

目前的方法可行,但如果要有大量的客户,效率会非常低。

+0

不'order.customer'存储'customer.id'或'customer.email'? – 2011-12-24 12:40:37

你的第二个查询仅返回1行的原因,是因为奥尤没有一个GROUP BY。与许多SQL数据库不同,MySQL允许您将非聚合字段与聚合字段混合使用,即使其技术上无效的SQL,结果也是不可预测的。

尝试

SELECT c.id, c.email, COUNT(o.customer) AS numOrders 
FROM customers c 
    INNER JOIN orders o on (o.customer=c.email) 
    WHERE o.siteid= 'calico' 
GROUP BY c.id, c.email 
+0

按主键进行分组时,它是技术上有效的SQL(按照SQL-2003 +标准) - 尽管MySQL没有真正检查它,它也允许技术上无效的查询。 – 2011-12-24 12:36:05

+0

哇,谢谢!这完美的作品:) – Peter 2011-12-24 12:47:25

你可以加入两个表是这样的:

SELECT c.* 
FROM customers c 
INNER JOIN orders o ON o.customer = c.id 

使用一个Inner Join只会造成有订单表项的客户。

SELECT c.* 
    , COUNT(*) AS numOrders 
FROM customers c 
    JOIN orders o 
    ON o.customer = c.id 
WHERE o.siteid = 'calico' 
GROUP BY c.id 

不知道这是否会工作,但你可以尝试:

SELECT c.*, COUNT(o.customer) AS numOrders FROM customers c 
JOIN orders o on o.customer = c.id 
WHERE o.siteid= 'calico' AND o.customer=c.email AND numOrders > 0 
GROUP BY c.id, c.email 

SELECT 
    customers.*, 
    count(*) as ordercount 
FROM customers 
INNER JOIN orders ON customers.id=orders.customer 
WHERE orders.siteid= 'calico' 
GROUP BY customers.id; 

SELECT c.id, c.email, COUNT(o.customer) AS numOrders 
FROM customers c, orders o 
WHERE o.siteid= 'calico' AND o.customer=c.email 
GROUP BY c.id, c.email