Как фильтровать кортежи 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)
Другие вопросы по тегам