【发布时间】:2020-06-22 23:06:17
【问题描述】:
Table Orders
| id |
|----|
| 1 |
| 2 |
| 3 |
Table Items
| id |
|----|
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
Table OrderItems
| order_id | item_id |
|---------------------|
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
|---------------------|
| 2 | 1 |
| 2 | 4 |
| 2 | 5 |
|---------------------|
| 3 | 1 |
| 3 | 2 |
| 3 | 4 |
| 3 | 5 |
因此用户可以在前端使用运算符ANDOR 和比较EQUAL( = )、NOT EQUAL( != ) 构建动态查询。他还可以创建带括号的条件组。
基于这些要求,我将在WHERE 部分中创建动态表达式。
示例:用户想要所有具有项目 1 和项目 2 或 3 而不是项目 4 的订单
表达式构建:
item_id = 1 AND (item_id = 2 OR item_id = 3) AND item_id != 4
根据这个表达式,只有 Order 1 应该被选中。
我的解决方案是 JOIN order_id 上的表 OrderItems 与 AND 运算符一样经常存在以获得结果:
SELECT o.id
FROM Orders o
INNER JOIN OrderItems oi1 ON o.id = oi1.order_id
INNER JOIN OrderItems oi2 ON oi1.order_id = oi2.order_id
INNER JOIN OrderItems oi3 ON oi2.order_id = oi3.order_id
WHERE o1.item_id = 1 AND (oi2.item_id = 2 OR oi2.item_id = 3) AND oi3.item_id != 4
GROUP BY o.id
有没有更优雅的解决方案?如果有更复杂的查询将有越来越多的连接,则可能会出现问题...
【问题讨论】:
标签: sql postgresql join select where-clause