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”)。
有没有办法做到这一点?
目前的方法可行,但如果要有大量的客户,效率会非常低。
你的第二个查询仅返回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
按主键进行分组时,它是技术上有效的SQL(按照SQL-2003 +标准) - 尽管MySQL没有真正检查它,它也允许技术上无效的查询。 – 2011-12-24 12:36:05
哇,谢谢!这完美的作品:) – 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
不'order.customer'存储'customer.id'或'customer.email'? – 2011-12-24 12:40:37