首页 > 解决方案 > PostgreSQL 获取带有物品的订单

问题描述

我在数据库中有以下表,

订单:

    |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"}]

谢谢。

标签: sqldatabasepostgresql

解决方案


假设您现有的查询基本有效,我做了以下更改......

  • 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

推荐阅读