Как фильтровать кортежи SQL по количеству членов
Поэтому я работаю над проблемой SQL, в которой у меня есть база данных баров и пива, из которой я хочу: перечислить все бары, в которых подают пиво, которое нравится Майку, и которые посещают более одного пьющего.
База данных состоит из:
likes (drinker, beer)
frequents(dinker, bar)
sells(bar, beer)
Итак, я попробовал:
SELECT bar
FROM beer.sells
WHERE beer IN
(SELECT beer
FROM beer.likes
WHERE drinker = 'Mike') AND bar IN
(SELECT bar FROM beer.frequents HAVING COUNT(drinker) > 1)
Что не сработало... почему сравнение по количеству (пьющих) не работает как фильтр для фильтрации баров, которые посещают менее 2 пьющих?
3 ответа
Решение
Похоже, вам нужно GROUP BY bar
в баре подзапрос. В противном случае вы получите COUNT(*)
от beer.frequents
что не то, что вы хотите:
SELECT bar
FROM beer.sells
WHERE beer IN
(SELECT beer
FROM beer.likes
WHERE drinker = 'Mike') AND bar IN
(SELECT bar FROM beer.frequents GROUP BY bar HAVING COUNT(drinker) >= 2)
Для работы агрегированного COUNT вам необходимо указать "GROUP BY":
SELECT bar
FROM beer.sells
WHERE beer IN
(SELECT beer
FROM beer.likes
WHERE drinker = 'Mike'
)
AND bar IN
(SELECT bar
FROM beer.frequents
GROUP BY bar
HAVING COUNT(drinker) > 1
)
"Которые посещают более одного пьющего". <> HAVING COUNT(drinker) > 2
(1)
SELECT bar
FROM beer.sells
WHERE beer IN
(SELECT beer
FROM beer.likes
WHERE drinker = 'Mike')
AND bar IN
(SELECT bar
FROM beer.frequents
GROUP BY bar
HAVING COUNT(drinker) > 1)