Вернуть строки из таблицы и добавить поле для этой строки, если идентификатор связан с другой таблицей - PullRequest
0 голосов
/ 02 апреля 2020

Используемая СУБД: Amazon Aurora

У меня есть таблица, в которой я храню список всех моих продуктов, назовем ее products

+----+--------------+
| id | product_name |
+----+--------------+
| 1  | Product 1    |
+----+--------------+
| 2  | Product 2    |
+----+--------------+
|    |              |
+----+--------------+

Другая таблица называется redeemed_products stores идентификатор продукта, который пользователь выкупил.

+----+---------+------------+
| id | user_id | product_id |
+----+---------+------------+
| 1  | 1       | 1          |
+----+---------+------------+
|    |         |            |
+----+---------+------------+
|    |         |            |
+----+---------+------------+

Я хотел бы получить все строки products и добавить дополнительное поле к строке, которая имеет отношение в redeemed_products

+----+--------------+----------+
| id | product_name | redeemed |
+----+--------------+----------+
| 1  | Product 1    | true     |
+----+--------------+----------+
| 2  | Product 2    |          |
+----+--------------+----------+
|    |              |          |
+----+--------------+----------+

Цель этого - получить список продуктов, и он покажет, какой из продуктов уже был выкуплен пользователем. Я не знаю, как мне следует подойти к этой проблеме.

Ответы [ 2 ]

2 голосов
/ 02 апреля 2020

Использовать внешнее соединение:

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;

Обратите внимание, что это будет повторять строки из таблицы products, если product_id встречается более одного раза в таблице redeemed_products (например, один и тот же * 1007). * для нескольких user_id с).

В этом случае вы можете использовать скалярный суб-выбор:

select p.id, p.product_name,
       exists (select * 
               redeemed_products rp 
               where rp.product_id = p.id) as redeemed
from products p;

Вы не пометили свою СУБД, но приведенный выше стандарт ANSI SQL, но не все Продукты СУБД фактически поддерживают логические выражения, подобные приведенным в списке SELECT.

0 голосов
/ 02 апреля 2020

Один из вариантов - использование условия в запросе 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
...