SQL — Выберите только строки с одним результатом в таблице с одним или несколькими параметрами — Таблица отношений

#mysql #sql #postgresql

#mysql #sql #postgresql

Вопрос:

У меня есть таблица, в которой указаны отношения продуктов и цветов. Каждый продукт имеет один или несколько цветов. Возможно ли выполнить запрос, который возвращает только те продукты, которые имеют только один цвет?

Пример таблицы :

  ---- ------------ ---------- 
| ID | product_id | color_id |
 ---- ------------ ---------- 
|  1 |          1 |        5 |
|  2 |          2 |        2 |
|  3 |          3 |        1 |
|  4 |          3 |        4 |
|  5 |          3 |        8 |
|  6 |          4 |        2 |
|  7 |          4 |        3 |
|  8 |          5 |        5 |
|  9 |          6 |        7 |
| 10 |          6 |        4 |
 ---- ------------ ---------- 
  

Я хочу вернуть только идентификаторы: 1 , 2, 8 . (product_id: 1 , 2 , 5 )

* Все значения (комбинации) уникальны. У меня не может быть двух продуктов с одинаковым цветом (color_id).

Ответ №1:

Просто используйте having :

 select product_id, max(color_id)
from t
group by product_id
having count(*) = 1;
  

Комментарии:

1. Работает 🙂 ! Я совершенно забыл о having

2. @akina да, все значения (комбинации) уникальны. У меня не может быть двух продуктов с одинаковым цветом (color_id).

3. hum, having не работает с where color_id = 5 (Результаты : 1, 5)

4. @bmpf_pt скрипка не согласилась с вами. Проверьте себя еще раз.

Ответ №2:

 SELECT product_id 
FROM table
GROUP BY product_id 
HAVING MIN(color_id) = MAX(color_id)
  

Работает корректно, даже если (product_id, color_id) не определено как УНИКАЛЬНОЕ.

Комментарии:

1. hum, having не работает с where color_id = 5 (Результаты : 1, 5)

2.@bmpf_pt having не работает с where color_id = 5 (Результаты: 1, 5 ) скрипка не согласилась с вами. Проверьте себя еще раз.

3. Проверьте это сейчас: dbfiddle.uk /…

4. @bmpf_pt Все правильно. Вы выбираете только те строки, которые имеют color_id = 5 . Все такие product_id возвращаются — что не так? PS. Я ничего не вижу color_id = 5 в вашем вопросе … PPS. Хотя color_id = 5 ни ГРУППИРОВКА, ни необходимость выбора DISTINCT достаточны (для unique (product_id, color_id) даже DISTINCT не требуется — простой ВЫБОР).

Ответ №3:

 select product_id, count(color_id) from table
group by product_id
having count(color_id) = 1
  

Комментарии:

1. hum, having не работает с where color_id = 5 (Результаты : 1, 5)

2. Синтаксическая ошибка при ONLY_FULL_GROUP_BY, в противном случае неверный результат.