Как фильтровать кортежи SQL по количеству членов - PullRequest
1 голос
/ 12 февраля 2012

Итак, я работаю над проблемой 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 ]

2 голосов
/ 12 февраля 2012

Вам нужно 'GROUP BY', чтобы ваш агрегированный COUNT работал:

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
   )
2 голосов
/ 12 февраля 2012

Похоже, вам нужно 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)
1 голос
/ 12 февраля 2012

", которые посещают более чем один пьющий." <> 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)
...