Как объединить несколько (четыре) таблицы, используя sql с условиями? - PullRequest
0 голосов
/ 13 марта 2020

Я пытаюсь создать запрос SQL, который условно извлекает данные из нескольких таблиц.

У меня есть четыре таблицы:

orders

+------+------------+------------+
| id   | date_added | currency   |
+------+------------+------------+
|   1  | 2018-07-23 |          1 |
+------+------------+------------+

order_items

+------+------------+------------+---------------+---------------+
| id   | order_id   | price      | product_id    | product_type  |
+------+------------+------------+---------------+---------------+
|   1  | 1          | 100.00     |          1    |   ticket      |
+------+------------+------------+---------------+---------------+

order_data

+------+--------------+---------------+
| id   | order_id     | ext_order_ref |
+------+--------------+---------------+
|   1  | 1            |         ABC   |
+------+--------------+---------------+

products

+------+------------+------------+
| id   | date       | product_id |
+------+------------+------------+
|   1  | 2020-03-12 |          1 |
+------+------------+------------+
|   2  | 2020-03-18 |          2 |
+------+------------+------------+
|   3  | 2020-03-20 |          3 |
+------+------------+------------+

Мне нужно вывести заказы со следующими условиями:

  • Каждый заказ в строка с итогом (вычисляется из позиций заказа с соответствующим идентификатором заказа)
  • 'ext_order_ref' из таблицы order_data, которая соответствует этому заказу
  • Включать только те позиции заказа, которые имеют указанный c продукт тип
  • Включать только заказы с продуктами из определенного диапазона дат

Предпочитаемый результат будет выглядеть следующим образом:

+------------+------------+--------------+
| order_id   | total      | ext_order_ref|
+------------+------------+--------------+
|   1        | 100        |          ABC |
+------------+------------+--------------+

Мой текущий запрос в основном такой; Посоветуйте пожалуйста

SELECT
orders.id as order_id,
SUM(order_items.price) as total,
order_data.ext_order_ref

FROM orders

INNER JOIN order_data
ON orders.id = order_data.ext_order_ref

RIGHT JOIN order_items
ON orders.id = order_items.order_id

LEFT JOIN products
ON order_items.product_id = products.product_id
WHERE order_items.product_type = 'ticket' AND products.date BETWEEN '2020-03-12' AND '2020-03-18'

GROUP BY orders.id

Почти работает, но не совсем. Дата особенно вызывает проблемы.

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 13 марта 2020

Я не понимаю, зачем вам вообще нужны внешние соединения. Если я правильно следую условиям:

SELECT o.id as order_id,
       SUM(oi.price) as total,
       od.ext_order_id
FROM orders o INNER JOIN
     order_data od
     ON o.id = od.ext_order_id INNER JOIN
     order_items oi
     ON o.id = oi.order_id INNER JOIN
     products p
     ON oi.product_id = p.product_id
WHERE oi.product_type = 'ticket' AND
      p.date >= '2020-03-12' AND 
      p.date < '2020-03-19'
GROUP BY o.id, od.ext_order_id;

Обратите внимание на использование псевдонимов таблиц, чтобы легче было писать и читать запрос.

0 голосов
/ 13 марта 2020

Сначала определите таблицу управления для запроса и сформируйте запрос на основе таблицы управления. Управляющая таблица - это одна основная таблица, из которой соединяются другие таблицы.

Более подробная информация о таблицах управления от askTom

В вашем случае таблица управления - это таблица заказов. Вы переключаетесь между RIGHT OUTER JOIN и LEFT OUTER JOIN. Это приведет к путанице в наборе результатов.

Я изменил запрос. Посмотрите, работает ли это.

SELECT
orders.id as order_id,
SUM(order_items.price) as total,
order_data.ext_order_id

FROM orders

INNER JOIN order_data
ON orders.id = order_data.ext_order_id

LEFT OUTER JOIN order_items
ON orders.id = order_items.order_id

LEFT OUTER JOIN products
ON order_items.product_id = products.product_id
WHERE order_items.product_type = 'ticket' AND products.date BETWEEN '2020-03-12' AND '2020-03-18'

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