#php #mysql #sql
#php #mysql #sql
Вопрос:
У меня есть база данных, которая содержит продукты, назначенные пользователям. Но если идентификатор пользователя равен 0, то продукт присваивается всем, и если он содержит определенный идентификатор, то он связан с конкретным пользователем. Теперь я хочу получить весь продукт для пользователя, и если пользователь не назначил продукт, то я хочу, чтобы продукт был назначен всем.
Вот как выглядит моя таблица:
ID | PRODUCT ID | ACTIVE | CUSTOMER ID
1 | 100 | 1 | 0
2 | 100 | 0 | 24
3 | 101 | 1 | 0
4 | 101 | 0 | 24
5 | 103 | 1 | 0
И теперь я хочу получить только строки с идентификаторами 2, 4, 5. Я попытался сделать это с помощью:
SELECT `id`, `product_id`, MAX(`customer_id`), `active`
FROM `products`
WHERE `customer_id` IN (0,24)
GROUP BY `product_id`
ORDER BY `product_id`
LIMIT 50
Но результат был не таким, каким я ожидал..
У меня есть MySQL 5.6
Комментарии:
1. Я смущен, в вашем вопросе говорится о пользователе, но в таблице нет пользователя,
2. Каков ожидаемый результат?
3. Я не понимаю, как только желаемые строки 2, 4 и 5 соответствуют тому, что вы сказали ранее. Не могли бы вы пояснить, почему должны быть возвращены только те?
4. @P.Salmon Я забыл, customer_id = user_id, моя ошибка
Ответ №1:
Хммм … Я думаю, вам нужна расстановка приоритетов:
select *
from (select p.*,
row_number() over (partition by product_id order by customer_id desc) as seqnum
from products p
where p.customer_id in (0, 24)
) p
where seqnum = 1;
Это возвращает одну строку для каждого продукта, где 0
24
присвоено или. Строка отдает предпочтение клиенту 24, а не 0.
Альтернативный метод заключается в использовании union all
(предполагая, что приведенная выше логика — это то, что вы хотите):
select p.*
from products p
where p.customer_id = 24 or
(p.customer_id = 0 and
not exists (select 1
from products p2
where p2.product_id = p.product_id and
p2.customer_id = 24
)
);
Комментарии:
1. В MySQL 5.6 нет ROW_NUMBER()
2. @Akhmed . , , Эта информация была добавлена после того, как я ответил.
3. @GordonLinoff ваш 2-й запрос уже задан в качестве ответа.
Ответ №2:
Используйте NOT EXISTS
в WHERE
предложении:
SELECT p.*
FROM products p
WHERE p.customer_id = 24
OR (
p.customer_id = 0
AND
NOT EXISTS (SELECT 1 FROM products WHERE product_id = p.product_id AND customer_id = 24)
)
Смотрите демонстрацию.
Результаты:
> id | product_id | active | customer_id
> -: | ---------: | -----: | ----------:
> 2 | 100 | 0 | 24
> 4 | 101 | 0 | 24
> 5 | 103 | 1 | 0