sql - 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"}]
谢谢。
解决方案
假设您现有的查询基本有效,我做了以下更改......
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
推荐阅读
- php - Laravel:无法将数据库连接从本地更改为远程
- linux - Amazon Linux AMI 18.03 的默认文件系统是什么
- git - Git SSH 问题:终端工作正常,但所有 GUI 客户端都失败
- javascript - AJAX DataTable Server Side 在将 serverSide 从 true 更改为 false 时遇到错误
- mysql - 在一天中的特定时间检索数据
- r - 重新排列两列,使第一列的值在 R 中总是更大
- javascript - 无法从 html 获取 javascript 中的用户输入
- sql - 在 MS Access vba 发送的更新 SQL Server 查询中循环
- leaflet - 在非地理地图中编辑比例尺
- python - enumerate() 不仅仅是 zip(range(len())) 吗?