SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 14.10.2015 17:45:48

nubi
Участник
Зарегистрирован: 14.10.2015
Сообщений: 14

Количество строк

Как узнать количество строк в запросе с использованием GROUP BY?
Стандартный COUNT(*) показывает количество сгруппированных строк по ключу, а не общее количество выбранных.
Например есть таблица table1
id, item_id
1    1
2    2
3    1
4    2
5    3

SELECT COUNT(*) AS cnt FROM table1 GROUP BY item_id

Результат:
cnt
2
2
1

вместо одной записи с количеством строк(3)

Неактивен

 

#2 14.10.2015 17:47:50

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Количество строк

А зачем Вам группировка, если общее количество выбраных нужно?

SELECT COUNT(*) AS cnt FROM table1;


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 14.10.2015 17:51:36

nubi
Участник
Зарегистрирован: 14.10.2015
Сообщений: 14

Re: Количество строк

deadka написал:

А зачем Вам группировка, если общее количество выбраных нужно?

SELECT COUNT(*) AS cnt FROM table1;

Я упрощённо написал. Использую GROUP BY в связке с обеднением таблиц для фильтров.

Неактивен

 

#4 14.10.2015 17:55:41

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Количество строк

Если

SELECT COUNT(distinct item_id) AS cnt FROM table1;

это не то, что Вам нужно, то приведите результат в том виде, в каком Вы его хотите получить


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#5 14.10.2015 18:10:14

nubi
Участник
Зарегистрирован: 14.10.2015
Сообщений: 14

Re: Количество строк

Луче опишу пример.
Есть 3 таблицы:
users
   id
   name
documents
   id
   name
user_document
   user_id
   document_id
Нужно выбрать всех users у которых есть все указание document


SELECT users.id
  FROM users
INNER JOIN user_document ON users.id=user_document.user_id
  WHERE user_document.document_id IN(1,2,3)
  GROUP BY user_document.user_id
  HAVING COUNT(user_document.user_id)>='3' # количество значений в user_document.document_id IN(1,2,3)
 

Такой вариант работает, но для постраничного просмотра мне надо знать сколько все users соответствует фильтрам.

Неактивен

 

#6 14.10.2015 18:20:08

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Количество строк

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);
Вернет нужное количество пользователей


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#7 14.10.2015 18:29:19

nubi
Участник
Зарегистрирован: 14.10.2015
Сообщений: 14

Re: Количество строк

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, надо чтобы обязательно были все указанные в условии.

Неактивен

 

#8 14.10.2015 19:14:41

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Количество строк

Создайте на sqlfiddle пример с тестовым наполнением таблиц и приведите сюда непосредственный результат данных, которые хотите получить.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#9 14.10.2015 19:51:04

nubi
Участник
Зарегистрирован: 14.10.2015
Сообщений: 14

Re: Количество строк

deadka написал:

Создайте на sqlfiddle пример с тестовым наполнением таблиц и приведите сюда непосредственный результат данных, которые хотите получить.

http://sqlfiddle.com/#!9/25128/2
Хочу выбрать users у которых есть documents со всеми указанными id (1,2)

Неактивен

 

#10 14.10.2015 19:53:44

nubi
Участник
Зарегистрирован: 14.10.2015
Сообщений: 14

Re: Количество строк

nubi написал:

deadka написал:

Создайте на sqlfiddle пример с тестовым наполнением таблиц и приведите сюда непосредственный результат данных, которые хотите получить.

http://sqlfiddle.com/#!9/25128/2
Хочу выбрать users у которых есть documents со всеми указанными id (1,2)

Даже не просто выбрать, а узнать их количество.

Отредактированно nubi (14.10.2015 19:54:00)

Неактивен

 

#11 14.10.2015 20:14:58

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Количество строк

with rollup ?

Неактивен

 

#12 14.10.2015 20:35:58

nubi
Участник
Зарегистрирован: 14.10.2015
Сообщений: 14

Re: Количество строк

vasya написал:

with rollup ?

Честно говоря не понимаю о чём Вы. Знаком с mysql на поверхностном уровне.

Неактивен

 

#13 14.10.2015 20:44:35

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Количество строк

SELECT item_id, COUNT(*) AS cnt FROM table1 GROUP BY item_id with rollup; --в последней строчке вернет нужную вам цифру

Неактивен

 

#14 14.10.2015 21:37:15

nubi
Участник
Зарегистрирован: 14.10.2015
Сообщений: 14

Re: Количество строк

vasya написал:

SELECT item_id, COUNT(*) AS cnt FROM table1 GROUP BY item_id with rollup; --в последней строчке вернет нужную вам цифру

Спасибо. Как вариант подходит, единственно что приходиться выполнять запрос 2 раза:
1). Чтобы узнать количество всех записей.
2). Чтобы вывести нужную страницу (LIMIT).

Неактивен

 

#15 14.10.2015 21:51:46

nubi
Участник
Зарегистрирован: 14.10.2015
Сообщений: 14

Re: Количество строк

Поротестил такой вариант http://sqlfiddle.com/#!9/25128/24 и в зависимости от фильтров вставляется или нет дополнительная строка и результат не правильный.


SELECT u.id, COUNT(*) AS cnt
FROM users u
INNER JOIN user_document ud ON u.id=ud.user_id
WHERE ud.document_id IN(1,2)
GROUP BY ud.user_id with rollup
HAVING COUNT(ud.user_id)>='2'

Неактивен

 

#16 14.10.2015 22:31:56

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Количество строк

SELECT u.id FROM users u INNER 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';


возвращает пользователя 1, у которого есть первый и второй документ, все хорошо с результатом?

Если замените u.id на count(u.id) - получите количество.

Что касается неправильного результата - телепатия не является нашей сильной стороной, увы sad.
При каком именно запросе Вы получаете неправильный результат, и какой результат является правильным?


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#17 14.10.2015 22:39:48

nubi
Участник
Зарегистрирован: 14.10.2015
Сообщений: 14

Re: Количество строк

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)

Неактивен

 

#18 14.10.2015 23:12:50

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Количество строк

Касаемо ожидаемого результата - почему Вы там тройку ожидаете?
Есть только один пользователь с паспортом и визой сша - это 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 (паспорт и виза сша).


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#19 15.10.2015 00:12:09

nubi
Участник
Зарегистрирован: 14.10.2015
Сообщений: 14

Re: Количество строк

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)

Неактивен

 

#20 15.10.2015 00:21:51

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Количество строк

Так, бритва Оккама в помощь.

Запрос

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'


решает Вашу задачу?


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#21 15.10.2015 01:11:14

nubi
Участник
Зарегистрирован: 14.10.2015
Сообщений: 14

Re: Количество строк

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)

Неактивен

 

#22 15.10.2015 01:20:12

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Количество строк

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'

Оно?


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#23 15.10.2015 01:24:54

nubi
Участник
Зарегистрирован: 14.10.2015
Сообщений: 14

Re: Количество строк

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

Неактивен

 

#24 15.10.2015 01:41:23

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Количество строк

Показывает самое что ни на есть количество уникальных u.id, которые подходят под условие - в смысле, что у пользователя есть и паспорт и виза сша. Возвращается 1 такой пользователь - Sveta.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#25 15.10.2015 11:21:23

nubi
Участник
Зарегистрирован: 14.10.2015
Сообщений: 14

Re: Количество строк

deadka написал:

Показывает самое что ни на есть количество уникальных u.id, которые подходят под условие - в смысле, что у пользователя есть и паспорт и виза сша. Возвращается 1 такой пользователь - Sveta.

Если поменять условия на 1 и 5 с такими documents двое users (Vova, Misha), результатом будет:
cnt
1
1

http://sqlfiddle.com/#!9/25128/49

SELECT count(distinct u.id) AS cnt
FROM users u JOIN user_document ud ON u.id=ud.user_id
WHERE ud.document_id IN(1,5)  
GROUP BY ud.user_id HAVING COUNT(ud.user_id)>='2'

Отредактированно nubi (15.10.2015 11:21:57)

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson