2012-02-12 2 views
1

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

Что не работает ... почему не COUNT() Стабильный сравнительную работу в качестве фильтра для отфильтровать бары, в которых есть менее 2 пьющих, которые их посещают?

+0

базы данных, в том числе. конкретные версии PLS - некоторые функции поддержки других нет. –

+0

_ ", которые часто посещаются более чем ** одним ** пьющим." _ <> 'HAVING COUNT (drinker)> 2' – gdoron

+0

Я верю, что частоты (dinker, bar) в определении таблицы должны быть частыми (пьющие, бары) – Appleman1234

ответ

2

Похоже, вам нужен 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) 
+0

Его спросили 1, но он написал 2, вы должны исправить свою ошибку, см. Мой ответ. – gdoron

+0

@gdoron Yep, изменено на '> = 2' –

2

Вы должны '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 
    ) 
1

«, который часто посещают более один пьющий. " <>HAVING COUNT(drinker) > 2()

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) 
Смежные вопросы