已解决问题
我有两个表,订单和客户,我想找到订单大于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”)。
有没有办法做到这一点?
目前的方式有效,但如果有大量客户,效率会非常低。
答案 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