Задавайте вопросы, мы ответим
Вы не зашли.
Как узнать количество строк в запросе с использованием GROUP BY?
Стандартный COUNT(*) показывает количество сгруппированных строк по ключу, а не общее количество выбранных.
Например есть таблица table1
id, item_id
1 1
2 2
3 1
4 2
5 3
Неактивен
А зачем Вам группировка, если общее количество выбраных нужно?
Неактивен
deadka написал:
А зачем Вам группировка, если общее количество выбраных нужно?
SELECT COUNT(*) AS cnt FROM table1;
Я упрощённо написал. Использую GROUP BY в связке с обеднением таблиц для фильтров.
Неактивен
Если
Неактивен
Луче опишу пример.
Есть 3 таблицы:
users
id
name
documents
id
name
user_document
user_id
document_id
Нужно выбрать всех users у которых есть все указание document
Неактивен
Неактивен
deadka написал:
SELECT count(distinct u.id) FROM users u JOIN user_document ud ON u.id=ud.user_id WHERE ud.document_id IN(1,2,3);Вернет нужное количество пользователей
Этот вариант подходит если нужно выбрать users у которых есть любой из documents, надо чтобы обязательно были все указанные в условии.
Неактивен
Создайте на sqlfiddle пример с тестовым наполнением таблиц и приведите сюда непосредственный результат данных, которые хотите получить.
Неактивен
deadka написал:
Создайте на sqlfiddle пример с тестовым наполнением таблиц и приведите сюда непосредственный результат данных, которые хотите получить.
http://sqlfiddle.com/#!9/25128/2
Хочу выбрать users у которых есть documents со всеми указанными id (1,2)
Неактивен
nubi написал:
deadka написал:
Создайте на sqlfiddle пример с тестовым наполнением таблиц и приведите сюда непосредственный результат данных, которые хотите получить.
http://sqlfiddle.com/#!9/25128/2
Хочу выбрать users у которых есть documents со всеми указанными id (1,2)
Даже не просто выбрать, а узнать их количество.
Отредактированно nubi (14.10.2015 19:54:00)
Неактивен
with rollup ?
Неактивен
vasya написал:
with rollup ?
Честно говоря не понимаю о чём Вы. Знаком с mysql на поверхностном уровне.
Неактивен
SELECT item_id, COUNT(*) AS cnt FROM table1 GROUP BY item_id with rollup; --в последней строчке вернет нужную вам цифру
Неактивен
vasya написал:
SELECT item_id, COUNT(*) AS cnt FROM table1 GROUP BY item_id with rollup; --в последней строчке вернет нужную вам цифру
Спасибо. Как вариант подходит, единственно что приходиться выполнять запрос 2 раза:
1). Чтобы узнать количество всех записей.
2). Чтобы вывести нужную страницу (LIMIT).
Неактивен
Поротестил такой вариант http://sqlfiddle.com/#!9/25128/24 и в зависимости от фильтров вставляется или нет дополнительная строка и результат не правильный.
Неактивен
Неактивен
deadka написал:
Если замените u.id на count(u.id) - получите количество.
http://sqlfiddle.com/#!9/25128/27
Результат:
id cnt
1 2
3 4
а ожидалось
id cnt
1 2
3 1
Отредактированно nubi (14.10.2015 22:41:02)
Неактивен
Касаемо ожидаемого результата - почему Вы там тройку ожидаете?
Есть только один пользователь с паспортом и визой сша - это Sveta, ее id Вам запрос
Неактивен
deadka написал:
Касаемо ожидаемого результата - почему Вы там тройку ожидаете?
Есть только один пользователь с паспортом и визой сша - это Sveta, ее id Вам запросSELECT u.id, COUNT(ud.user_id) AS cnt FROM users u JOIN user_document ud ON u.id=ud.user_id
WHERE ud.document_id IN(1,2) GROUP BY ud.user_id HAVING COUNT(ud.user_id)>='2'
и возвращает. Двойка - потому что нас интересовали только документы с id 1,2 (паспорт и виза сша).
Пример который приведён тут http://sqlfiddle.com/#!9/25128/27 отличается от кода который Вы комментируете.
Отредактированно nubi (15.10.2015 00:13:44)
Неактивен
Так, бритва Оккама в помощь.
Запрос
Неактивен
deadka написал:
Так, бритва Оккама в помощь.
ЗапросSELECT u.id, COUNT(ud.user_id) AS cnt FROM users u JOIN user_document ud ON u.id=ud.user_id
WHERE ud.document_id IN(1,2) GROUP BY ud.user_id HAVING COUNT(ud.user_id)>='2'
решает Вашу задачу?
Это решает задачу общего просмотра, но для динамических гридов нужно знать количество всех записей (с учётом фильтров).
Для меня главный вопрос как узнать количество записей сгруппированных GROUP BY.
Например мне нужны записи начиная с 550 по 600 возможно выравненных по имени, но чтобы правильно посчитать скроллинги мне надо знать общее количество всех записей.
Отредактированно nubi (15.10.2015 01:18:25)
Неактивен
Неактивен
deadka написал:
SELECT count(distinct u.id)
FROM users u JOIN user_document ud ON u.id=ud.user_id
WHERE ud.document_id IN(1,2)
GROUP BY ud.user_id HAVING COUNT(ud.user_id)>='2'
Оно?
К сожалению нет. count(distinct u.id) показывает количество сгруппированных строк по u.id а не количество уникальных u.id
Неактивен
Показывает самое что ни на есть количество уникальных u.id, которые подходят под условие - в смысле, что у пользователя есть и паспорт и виза сша. Возвращается 1 такой пользователь - Sveta.
Неактивен
deadka написал:
Показывает самое что ни на есть количество уникальных u.id, которые подходят под условие - в смысле, что у пользователя есть и паспорт и виза сша. Возвращается 1 такой пользователь - Sveta.
Если поменять условия на 1 и 5 с такими documents двое users (Vova, Misha), результатом будет:
cnt
1
1
http://sqlfiddle.com/#!9/25128/49
Отредактированно nubi (15.10.2015 11:21:57)
Неактивен