2013-11-19 3 views
1

Итак, у меня есть таблица с именем clients, другая - orders и другие две, orders_type_a и orders_type_b.Получить значения из нескольких таблиц, связанных

То, что я пытаюсь сделать, это создать запрос, который возвращает список всех клиентов, и для каждого клиента он должен вернуть количество заказов на основе идентификатора этого клиента и суммы денег, которую этот клиент уже потратил.

И ... Я понятия не имею, как это сделать. Я знаю логику этого, но не могу узнать, как перевести в запрос MySQL.

У меня есть базовое-thinkimgoodbutimnot знание MySQL, но в этой ситуации я действительно запутался.

Вот изображение, чтобы проиллюстрировать лучше процесс, который я пытаюсь сделать: The logic behind the query

Полезная дополнительная информация:

  • Каждый orders ряд только один type (который A или B)
  • Каждая строка orders может иметь несколько orders_type_X (где X - A или B)
  • заказы связаны с клиентом через колонку client_id
  • orders_type_X относятся с orders через колонку order_id

Этот процесс делается сегодня, делая запрос для извлечения клиентов, а затем из каждой записи возвращается код выполните другой запрос (с помощью php), чтобы получить заказы, а еще один - для получения значений. Таким образом, в основном для каждой строки, возвращенной из первого запроса, внутри нее есть еще два. Излишне говорить, что это ужасный подход, производительность отстойная, и я вот почему я хочу ее изменить.


UPDATE ширина колонок таблицы:

клиенты:

id | name | phone

заказы:

id | client_id | date

orders_type_a:

id | order_id | number_of_items | price_of_single_item

orders_type_b:

id | order_id | number_of_shoes_11 | number_of_shoes_12 | number_of_shoes_13 | price_of_single_shoe

Для любой дополнительной информации, необходимой, просто спросите.

ответ

0

Если я правильно вас понимаю, вы ищете что-то вроде этого?

select c.*, SUM(oa.value) + SUM(ob.value) as total 
from clients c 
inner join orders o on c.order_id = o.id 
inner join orders_type_a oa on oa.id = o.order_type_id AND o.type = 'A' 
inner join orders_type_b ob on ob.id = o.order_type_id AND o.type = 'B' 
group by c.id 

Я не знаю, фактические имена полей, но это возвращает информацию по каждому клиенту плюс одно поле «тотальный», содержащий сумму значений всех порядков как типа А и типа В. Возможно, вам придется настроить различные имена, чтобы заставить их работать, но помогает ли это вам в правильном направлении?

+0

Я добавил больше информации о таблицах, я думаю, теперь его легче понять процесс. –

0

Ответ Эрика находится на правильном пути. Однако, так как там может быть несколько orders_type_a и orders_type_b записи для каждого заказа, это немного сложнее:

SELECT c.id, c.name, c.phone, SUM(x.total) as total 
FROM clients c 
INNER JOIN orders o 
    ON o.client_id = c.id 
INNER JOIN (
    SELECT order_id, SUM(number_of_items * price_of_single_item) as total 
    FROM orders_type_a 
    UNION ALL 
    SELECT order_id, SUM((number_of_shoes_11 + number_of_shoes_12 + number_of_shoes_13) * price_of_single_shoe) as total 
    FROM orders_type_b 
) x 
    ON x.order_id = o.id 
GROUP BY c.id 
; 

Я делаю несколько предположений о том, как рассчитать сумму на основе столбцов в таблицах orders_type_x ,

+0

Я проверю это, когда вернусь домой –

+0

По какой-то причине, когда я запускаю этот запрос, он просто возвращает двух клиентов, а не всех из них. –

+0

У всех клиентов есть заказы? – bobwienholt

Смежные вопросы