Как получить только один из нескольких столбцов MySQL

#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