Клиенты, у которых в корзине есть товары

Используйте EXISTS с условием amount>0: он проверяет наличие товара и не размножает строку клиента при нескольких позициях в корзине.

Короткий ответ

Что ответить на собеседовании

Используйте EXISTS с условием amount>0: он проверяет наличие товара и не размножает строку клиента при нескольких позициях в корзине.

Подробный разбор

Ответ с пояснениями

Условие

Необходимо вывести список клиентов (id, email), у которых в таблице корзин присутствует хотя бы один товар (по полю amount).

-- Table "public.carts"
-- Column     | Type                        | Modifiers
-- -----------|-----------------------------|-----------------------------
-- sku        | bigint                      | not null
-- country    | country_enum                | not null
-- customer_id| bigint                      |
-- amount     | bigint                      | not null
-- updated_at | timestamp without time zone| default now()

-- Table "public.customer"
-- Column | Type  | Modifiers
-- -------|-------|----------------
-- id     | bigint| not null
-- email  | text  | not null

Ответ

Используйте EXISTS с условием amount>0: он проверяет наличие товара и не размножает строку клиента при нескольких позициях в корзине.

Запрос для приведённой схемы:

SELECT c.id, c.email
FROM public.customer AS c
WHERE EXISTS (
    SELECT 1
    FROM public.carts AS cart
    WHERE cart.customer_id = c.id
      AND cart.amount > 0
);

Строка корзины с нулевым или отрицательным amount не считается наличием товара. NULL customer_id ни с кем не соединится. Для частых запросов оцените индекс по customer_id, возможно частичный с предикатом amount>0; решение подтверждается планом.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее