Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Составление SQL-запросов > Запрос с подсчетом количества


Автор: sunnmas 14.9.2009, 20:07
Тема похожа на http://forum.vingrad.ru/topic-265234.html,

но немного отличается также есть 2 таблицы: sites, users.

нужно сделать следующее:

Выбрать только те записи, про которые в users написано более 7 раз

Например, пробую запрос:
SELECT sites.index, sites.site, COUNT(*) 
FROM sites, users
WHERE ((sites.index = users.index))
GROUP BY users.index

Выбирает:

index    site                            COUNT(*) 
120    http://www.2piar.net    1
121    http://www.3piar.net    8
122    http://www.4piar.net    5
123    http://www.5piar.net    7

А нужно выбрать:

index    site                            COUNT(*) 
121    http://www.3piar.net    8

P.S.:
SELECT sites.index, sites.site, COUNT(*) 
FROM sites, users
WHERE ((sites.index = users.index) AND COUNT(*)>7)
GROUP BY users.index 

не катит, потому сюда и обращаюсь за помощью, ибо больше ничего в голову не приходит (и не придет видимоsmile

Автор: Gudinya 14.9.2009, 20:18
Просто оберни свой запрос
Код

Select * from (
SELECT sites.index, sites.site, COUNT(*) cnt
FROM sites, users
WHERE ((sites.index = users.index))
GROUP BY users.index ) c
where c.cnt > 7


ну или 

Код

SELECT sites.index, sites.site, COUNT(*) cnt
FROM sites, users
WHERE ((sites.index = users.index))
GROUP BY users.index 
Having COUNT(*) >7

Автор: sunnmas 17.9.2009, 12:56
Спасибо, все получилось. Но появились усложнения.

Есть 2 таблицы, связанные по id:
1 sites:
id  site  

2 users:
id username error (тип enum 0 - нет ошибки, 1,2,3,.. - всякие ошибки) 
========================================================
Нужно получить такую выборку:
id site num_users
Условия для отбора:
Выбрать все сайты для которых есть в users количество записей не больше заданного (у меня 7), причем юзеры, содержащие ошибки в подсчет не должны попадать. Т.е. учитываются только валидные записи. И еще если записей нет в users для сайта, то должен выводиться сайт и num_users=0, т.е. похоже нужно задействовать LEFT JOIN, как в http://forum.vingrad.ru/topic-265234.html

Спасибо заранее




Автор: Zloxa 17.9.2009, 13:01
sunnmas
Код

wehre sites.index = users.index
  and users.error = 0
group by users.index
having count(*)>7

Автор: sunnmas 17.9.2009, 14:36
Полный текст моего запроса

SELECT sites.index, sites.site, users.reg_error, COUNT( users.index ) 
FROM sites
LEFT JOIN users ON sites.index = users.index
WHERE  (users.reg_error<>0)
GROUP BY sites.index
HAVING COUNT( users.index ) <7

Не выполняется: "И еще если записей нет в users для сайта, то должен выводиться сайт и num_users=0"

PS: Я ошибся в прошлом посте в утверждении 
"причем юзеры, содержащие ошибки в подсчет не должны попадать. учитываются только валидные записи". 
Правильное: 
"причем юзеры, содержащие 0 - ошибок нет в подсчет не должны попадать. учитываются только НЕ валидные записи" 

(Уже сам запутался, сорри, не ругайтесь)


Автор: sunnmas 17.9.2009, 15:05
аааа допер))

SELECT sites.index, sites.site, users.reg_error, COUNT( users.index ) 
FROM sites
LEFT JOIN users ON ( (sites.index = users.index)
AND (users.reg_error <>0) ) 
GROUP BY sites.index
HAVING COUNT( users.index ) <7

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)