MySQL - 两个表查询,带SUM

时间:2011-12-24 12:24:29

标签: php mysql select join

已解决问题

我有两个表,订单和客户,我想找到订单大于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字段是相同的值(即客户5下订单1,客户ID 5是“John”)。

有没有办法做到这一点?

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

6 个答案:

答案 0 :(得分:3)

你的第二个查询只返回1行的原因是因为oyu没有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

答案 1 :(得分:0)

你可以像这样加入两个表:

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

使用Inner Join只会导致订单表中包含条目的客户。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

不确定这是否有效,但您可以尝试:

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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