Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Count + Group by + Limit, Неверный Count 
V
    Опции темы
igorold
Дата 1.3.2010, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 557
Регистрация: 22.12.2005
Где: Россия->Урал-& gt;Миасс

Репутация: 5
Всего: 17



Есть такой Запрос:
Код

SELECT Problems.i, count(Distinct DocsAtt.i) FROM Problems left join DocsAtt on DocsAtt.ID=Problems.i 
WHERE Problems.Ispolnit='63' AND Problems.State<>'3' group by Problems.i ORDER BY Problems.i LIMIT 0, 8;


Смысл такой, к Таблице Problems присоединены записи Таблицы DocsAtt к одной записи в Problems может соответствовать от 0 и большее количество таблицы DocsAtt.
Мне в запросе необходимо подсчитать сколько всего записей из DocsAtt присоединено к записи Problems.
Вышеуказанный запрос дает такой результат:
Код

+------+---------------------------+
| i    | count(Distinct DocsAtt.i) |
+------+---------------------------+
| 4287 |                         0 |
| 4291 |                         0 |
| 6856 |                         6 |
+------+---------------------------+
3 rows in set (0.14 sec)

т.е. тут Limit действует до group by
Если Limit убираем, получаем верный результат:
Код

+------+---------------------------+
| i    | count(Distinct DocsAtt.i) |
+------+---------------------------+
| 4287 |                         0 |
| 4291 |                         0 |
| 6856 |                        31 |
| 7009 |                         4 |
+------+---------------------------+
4 rows in set (0.45 sec)

Limit убирать не хочется, т.к. в зависимости от выборки может быть много записей.

Как сделать, чтобы Limit правильно работал?

Добавлено через 4 минуты и 41 секунду
Самое интересное, если я убираю Distinct :
Код

SELECT Problems.i, count(DocsAtt.i) FROM Problems left join DocsAtt on DocsAtt.ID=Problems.i 
WHERE Problems.Ispolnit='63' AND Problems.State<>'3' group by Problems.i ORDER BY Problems.i LIMIT 0, 8;


Запрос работает правильно, но дело в том, что я упростил запрос и в нем несколько left join, по еще одному из которых тоже может быть больше одной записи, в этом случае count(DocsAtt.i) дает неверный результат.

Это сообщение отредактировал(а) igorold - 1.3.2010, 13:17


--------------------
... у семи нянек 14 сисек ...  
Putin here, Putin there, Putin almost everywhere!
PM MAIL   Вверх
Akina
Дата 1.3.2010, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Сделай запрос без лимита и оберни в лимит.
Код

SELECT * FROM
(
  SELECT Problems.i, count(Distinct DocsAtt.i) 
  FROM Problems 
  LEFT JOIN DocsAtt 
  ON DocsAtt.ID=Problems.i 
  WHERE Problems.Ispolnit='63' AND Problems.State<>'3' 
  GROUP BY Problems.i 
) p
ORDER BY p.i 
LIMIT 0, 8;


Но на большом массиве будут тормоза - это однозначный temporary table.

С другой стороны, мне непонятно, что именно надо лимитить...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
igorold
Дата 1.3.2010, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 557
Регистрация: 22.12.2005
Где: Россия->Урал-& gt;Миасс

Репутация: 5
Всего: 17



Спасибо, работает!

У пользователя по умолчанию есть в настройках какое количество строк формируемой таблицы выводить на экран.
Их может быть очень много и для удобства выводится в данном случае - по 8, с учетом всех шапок и многострочности каждой записи - как раз экран.
Некоторым, кому надо без листания, ставят - 100 и для обычной работы этого хватает, но т.к. метод универсальный, то приходится делать такие конструкции, потому что другие предпочитают листать ... 

Это сообщение отредактировал(а) igorold - 1.3.2010, 14:08


--------------------
... у семи нянек 14 сисек ...  
Putin here, Putin there, Putin almost everywhere!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0519 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.