SQL-запрос с подзапросами, объединяющий несколько таблиц — MySQL

#mysql #sql #subquery

#mysql #sql #подзапрос

Вопрос:

Таблицы представляют собой:

 1) Producers: id, name
2) Products: id, name, price, category_id, producer_id
3) Customers: id, name, surname, age, country_id
4) Customer_orders: id, customer_id, product_id, quantity, discount, order_date
  

Мне нужно найти производителя, чей доход был самым высоким, другими словами: найти производителя, для которого сумма всех произведенных продуктов price * quantity - discount является самой высокой.

Я полагаю, что я должен объединить таблицу customer_orders с product_id включенным столбцом products и products с producers таблицей в столбце id , а затем рассчитать соответствующий доход для всех производителей, а затем найти максимальное значение.

Проблема в том, как записать в MySQL.

Комментарии:

1. Что вы уже пробовали?

2. ничего заслуживающего упоминания, нужны несколько советов, как начать с такого запроса

Ответ №1:

Вы можете начать с чего-то вроде этого:

 SELECT SUM(price - discount) income, producers.name name FROM customer_orders LEFT JOIN products ON customer_orders.product_id = products.id LEFT JOIN producers ON producers.id = products.producer_id GROUP BY producer_id
  

Я не уверен, что это будет работать именно так, как я его ввел, но это должно быть отправной точкой.

Вот несколько полезных ссылок:

Left Joins Sum Function

Пожалуйста, обратите внимание: в настоящее время я работаю на сервере, где таблицы структурированы подобным образом, и это очень медленно и сложно что-либо сделать. Я бы посоветовал вам рассмотреть возможность хотя бы добавления общего порядка о и producer_id в customer_orders таблицу, чтобы сделать это намного проще.

Ответ №2:

Что вы хотите сделать, так это суммировать значения заказа для каждого производителя. Стоимость заказа определяется ценой, количеством и скидкой. Поскольку в таблице customer_orders можно найти только последние 2, вам придется присоединиться к таблице Products. Это можно сделать с помощью следующего запроса:

 select * from customer_orders
inner join products on products.id = customer_orders.product_id
  

Но поскольку мы должны группировать их по производителю, нам также понадобится имя или id производителя, поэтому мы также должны присоединиться к таблице producers:

 select * from customer_orders
inner join products on products.id = customer_orders.product_id
inner join producers on producers.id = products.producer_id
  

Теперь вы выбираете всю необходимую вам информацию. Для выполнения вычислений вам нужно заменить звездочку на:

 (customer_orders.quantity * customer_orders.discount) - products.price
  

который выдаст вам значение каждого заказа.

Чтобы суммировать весь заказ для данного производителя, вам нужно обернуть приведенную выше строку в SUM() функцию, и вам нужно добавить GROUP BY предложение в конце запроса.

 select SUM( (customer_orders.quantity * customer_orders.discount) - products.price) as value, producers.name from customer_orders
inner join products on products.id = customer_orders.product_id
inner join producers on producers.id = products.producer_id
group by producers.name