Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > select count и left join


Автор: Pfailed 21.9.2009, 13:05
Есть такого рода запрос
Код

SELECT clubs.id, clubs.name, clubs.description FROM clubs 
LEFT JOIN topics ON topics.club=clubs.id WHERE clubs.id IN (0, 1, 2, 3) OR clubs.subcategory=18
group by clubs.id
HAVING count(topics.id)>0
ORDER BY clubs.id


Он возвращает 2964 записи. Мне необходимо получить значение 2964 не извлекая сами записи, т.е. попросту воспользоваться COUNT().
Пробую так
Код

SELECT COUNT(clubs.id) FROM clubs
LEFT JOIN topics ON topics.club=clubs.id WHERE clubs.id IN (0, 1, 2, 3) OR clubs.subcategory=18
HAVING count(topics.id)>0


Но такой запрос возвращает число 31761, что не совпадает с 2964.
Подскажите, как организовать правильный запрос?

Автор: Zloxa 21.9.2009, 13:15
Pfailed, дык а group by зачем убрали?
Код

SELECT count(*)
LEFT JOIN topics ON topics.club=clubs.id WHERE clubs.id IN (0, 1, 2, 3) OR clubs.subcategory=18
group by clubs.id
HAVING count(topics.id)>0


Добавлено через 6 минут и 34 секунды
а вообще если яправильно понял идею:
Код

SELECT count(*)
INNER JOIN topics ON topics.club=clubs.id 
WHERE clubs.id IN (0, 1, 2, 3) OR clubs.subcategory=18

Автор: Pfailed 21.9.2009, 13:53
У вас в примерах упущено FROM. Так и задумано? Выдает ошибку
Цитата

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INNER JOIN topics ON topics.club=clubs.id WHERE clubs.id IN (0, 1, 2, 3) OR cl' at line 2


На такой запрос
Код

SELECT count(*) from clubs
INNER JOIN topics ON topics.club=clubs.id 
WHERE clubs.id IN (0, 1, 2, 3) OR clubs.subcategory=18


получаю 30156. Чтобы это число значило даже не знаю.

Цитата

дык а group by зачем убрали?


Потому что такой запрос 
Код

SELECT count(*) from clubs
LEFT JOIN topics ON topics.club=clubs.id WHERE clubs.id IN (0, 1, 2, 3) OR clubs.subcategory=18
group by clubs.id
HAVING count(topics.id)>0


Возвращает некие 2964 числа вместо одного  smile .

Автор: Zloxa 21.9.2009, 14:01
Цитата(Pfailed @  21.9.2009,  13:53 Найти цитируемый пост)
Возвращает некие 2964 числа вместо одного

Код

SELECT count(count(*)) from clubs
LEFT JOIN topics ON topics.club=clubs.id WHERE clubs.id IN (0, 1, 2, 3) OR clubs.subcategory=18
group by clubs.id
HAVING count(topics.id)>0

Цитата(Pfailed @  21.9.2009,  13:53 Найти цитируемый пост)
получаю 30156. 


Код

SELECT count(distinct clubs.id) from clubs
INNER JOIN topics ON topics.club=clubs.id 
WHERE clubs.id IN (0, 1, 2, 3) OR clubs.subcategory=18


Код

select count(*) from clubs WHERE (clubs.id IN (0, 1, 2, 3) OR clubs.subcategory=18) and exists (select null from topics  where topics.club=clubs.id )

Автор: Pfailed 21.9.2009, 14:19
Zloxa, большое спасибо  smile 
Второй и третий вариант работают, первый выдает ошибку, ну да это уже не важно.

Добавлено через 7 минут и 11 секунд
Вот только недопонял, в этих запросах учитывается условие HAVING count(topics.id)>0? Результат вроде как верный, хотя условия в запросе нет.

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