返回表中的行,如果ID与另一个表有关系,则为该行添加字段



使用的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_idredeemed_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

最新更新