使用的DBMS:Amazon Aurora
我有一张表,里面存储了我所有产品的列表,我们称之为products
+----+--------------+
| id | product_name |
+----+--------------+
| 1 | Product 1 |
+----+--------------+
| 2 | Product 2 |
+----+--------------+
| | |
+----+--------------+
另一个名为redeemed_products
的表存储用户兑换的产品的ID。
+----+---------+------------+
| id | user_id | product_id |
+----+---------+------------+
| 1 | 1 | 1 |
+----+---------+------------+
| | | |
+----+---------+------------+
| | | |
+----+---------+------------+
我想检索products
的所有行,并在redeemed_products
中有关系的行中添加一个额外的字段
+----+--------------+----------+
| id | product_name | redeemed |
+----+--------------+----------+
| 1 | Product 1 | true |
+----+--------------+----------+
| 2 | Product 2 | |
+----+--------------+----------+
| | | |
+----+--------------+----------+
这样做的目的是检索产品列表,并显示用户已经兑换了哪些产品。我不知道该如何处理这个问题。
使用外部联接:
select p.id, p.product_name, rp.product_id is not null as redeemed
from products p
left join redeemed_products rp on rp.product_id = p.id;
注意,如果product_id
在redeemed_products
表中出现不止一次(例如,对于多个user_id
,相同的product_id
(,则这将重复来自products
表的行。
如果是这种情况,您可以使用标量子选择:
select p.id, p.product_name,
exists (select *
redeemed_products rp
where rp.product_id = p.id) as redeemed
from products p;
您还没有标记您的DBMS,但上面是标准的ANSI SQL,但并不是所有的DBMS产品都支持SELECT列表中的布尔表达式。
一个选项是在LEFT JOIN查询中使用条件:
SELECT p.*, CASE WHEN r.product_id IS NOT NULL THEN 'true' END AS redeemed
FROM products p
LEFT JOIN redeemed_products r
ON r.product_id = p.id