PostgreSQL Получить заказы с предметами - PullRequest
0 голосов
/ 11 октября 2018

У меня есть следующие таблицы в базе данных,

Заказы:

    |order_id | 
----+---------+
  1 | 123-456 |
  2 | 123-455 | 
  3 | 123-454 |

Элементы заказа:

    |order_id |description| 
----+---------+------------
  1 | 123-456 |  ABC
  2 | 123-456 |  DEF
  3 | 123-456 |  GHI
  4 | 123-455 |  ABC
  5 | 123-454 |  DEF
  6 | 123-453 |  GHI

Я хочу сделать следующее:

SELECT o.*, array_to_json(array_agg(i.*)) as items
FROM orders o
LEFT OUTER JOIN order_items i
ON i.order_id = o.order_id
group by o.order_id

Мне нужно иметь возможность выбирать заказы с элементами, которые содержат определенное описание, но также сохранять все остальные элементы в заказе.

Так что, если я сделал следующее;

SELECT o.*, array_to_json(array_agg(i.*)) as items
FROM orders o
LEFT OUTER JOIN order_items i
ON i.order_id = o.order_id
WHERE i.description LIKE '%ABC%'
group by o.order_id

Мне нужен результат:

    |order_id |items| 
----+---------+------------
  1 | 123-456 |  [{"order_id":"123-456","description":"ABC"},{"order_id":"123-456","description":"DEF"},{"order_id":"123-456","description":"GHI"}]
  2 | 123-455 |  [{"order_id":"123-455","description":"ABC"}]

Спасибо.

Ответы [ 2 ]

0 голосов
/ 11 октября 2018
SELECT o.*, array_to_json(array_agg(i.*)) as items
FROM orders o
JOIN order_items i
ON i.order_id = o.order_id
WHERE o.order_id in(select oi.order_id from order_items oi where oi.description LIKE '%ABC%')
group by o.order_id
0 голосов
/ 11 октября 2018

Предполагая, что ваш существующий запрос в основном работает, я внес следующие изменения ...

  • o.* в o.order_id
  • WHERE <condition> в HAVING SUM(<condition>) >= 1

Это дает

SELECT o.order_id, array_to_json(array_agg(i.*)) as items
FROM orders o
LEFT OUTER JOIN order_items i
ON i.order_id = o.order_id
GROUP BY o.order_id
HAVING SUM(CASE WHEN i.description LIKE '%ABC%' THEN 1 END) >= 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...