#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, в противном случае неверный результат.