MySQL - запрос двух таблиц, с суммой - PullRequest
0 голосов
/ 24 декабря 2011

Вопрос решен

У меня есть две таблицы, заказы и клиенты, и я хотел бы найти всех клиентов, чьи заказы превышают 0.

Я в настоящее времяиспользуйте два запроса:

SELECT * FROM customers 

и

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

Я бы хотел превратить это в один запрос, чтобы он нашел всех клиентов, где они разместили один или несколько заказов вstore.

Я попробовал следующее, но это не работает:

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

(это дает только один результат, который является идентификатором клиента 1).

Iнужно только найти значение заказов и несколько значений из таблицы клиентов.

Поле клиента в заказах и поле идентификатора в клиентах совпадают (т. е. заказ 1 был размещен клиентом 5, идентификатор клиента5 - это «Джон»).

Есть ли способ сделать это?

Текущий способ работает, но он будет очень неэффективным, если будет большое количество клиентов.

Ответы [ 6 ]

3 голосов
/ 24 декабря 2011

Причина, по которой ваш второй запрос возвращает только 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 голосов
/ 24 декабря 2011
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
0 голосов
/ 24 декабря 2011
SELECT
  customers.*,
  count(*) as ordercount
FROM customers
INNER JOIN orders ON customers.id=orders.customer
WHERE orders.siteid= 'calico'
GROUP BY customers.id;
0 голосов
/ 24 декабря 2011

Не уверен, что это сработает, но вы можете попробовать:

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
0 голосов
/ 24 декабря 2011
SELECT c.*
     , COUNT(*) AS numOrders 
FROM customers c
  JOIN orders o 
    ON o.customer = c.id
WHERE o.siteid = 'calico'
GROUP BY c.id
0 голосов
/ 24 декабря 2011

Вы можете объединить две таблицы следующим образом:

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

Использование Inner Join приведет только к тем клиентам, у которых есть записи в таблице заказов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...