Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 21.11.2014, 14:42
Кандидат Javascript-наук
Отправить личное сообщение для iNfantry Посмотреть профиль Найти все сообщения от iNfantry
 
Регистрация: 29.10.2011
Сообщений: 132

SQL, проблема с группировкой
Подскажите пож, уже много часов бьюсь над проблемой, возможно чего-то не понимаю.

Есть таблицы

cat(id, title) - к примеру таблица одноуровневых категорий
cat_stat(cat_id, num, date) - статистика категории с каким-то абстрактным счетчиком, меняющимся со временем, примари кей на cat_id и date)
item(id, title) - какие-то данные, связанные с категориями, впринципе на эту таблицу вообще пофиг, просто для наглядности
cat_item(cat_id, item_id) - таблица связей предыдущей таблицы с категориями

Итак, в таблице cat_stat пишется какая-то инфа несколько раз в сутки для каждой категории, для того чтобы отслеживать изменение счетчика по времени, все обычно. Есть задача - получить список категорий с количеством item_id в таблице связей и суммой счетчиков из таблицы статистики (хотя пофигу на самом деле на сумму, можно и просто count(*) из той таблицы). Вобщем две групповые функции для двух таблиц которые джойнятся к первой. Казалось бы всё просто, НО - количество записей из таблицы cat_item умножается на количество записей в таблице статистики! Спрашивается почему и как это исправить?
Запрос:

SELECT c.id, COUNT(ci.item_id), SUM(cs.num)
FROM cat c, cat_item ci, cat_stat cs
WHERE c.id=ci.cat_id AND c.id=cs.cat_id
GROUP BY c.id

Еще раз - значение COUNT(ct.item_id) умножается на количество записей в cat_stat! Тоесть если в cat_item 3 записи для какой-то категории, а в cat_stat - 4 записи, то COUNT(ct.item_id) = 3*4 = 12, значение SUM(cs.num) также складывается 12 раз! Поясните, если я что-то в группировке не понимаю.
Ответить с цитированием
  #2 (permalink)  
Старый 21.11.2014, 14:53
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,205

Сообщение от iNfantry
получить список категорий с количеством item_id в таблице связей и суммой счетчиков из таблицы статистики
Как вариант...

Select
   a.id,
   a.title,
   (Select
       count(*)
    From
       cat_item as b
    Where
       b.cat_id=a.id
   ) as cntItem,
   (Select
       sum(c.num)
    From
       cat_stat as c
    Where
       c.cat_id=a.id
   ) as sumNum
From
   cat as a
Ответить с цитированием
  #3 (permalink)  
Старый 21.11.2014, 14:56
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,205

Сообщение от iNfantry
Казалось бы всё просто, НО - количество записей из таблицы cat_item умножается на количество записей в таблице статистики! Спрашивается почему и как это исправить?
Потому как у тебя не такое, как тебе нужно, количество записей в твоем декартовом кубе... Убери GROUP BY и агрегатные функции count(), sum() - увидишь тот суп, который ты поимел...

Ну, а исправление я уже показал...
Ответить с цитированием
  #4 (permalink)  
Старый 21.11.2014, 15:03
Кандидат Javascript-наук
Отправить личное сообщение для iNfantry Посмотреть профиль Найти все сообщения от iNfantry
 
Регистрация: 29.10.2011
Сообщений: 132

Вот-вот, правильно понял проблему с декартовым кубом! Получается что так сделать нельзя? Чтобы группировка сработала для двух таблиц для разного количества записей для каждой из них соответственно? С ползапросами всё конешно понятно, только не слишком ли это накладно для такой простой задачи?
Ответить с цитированием
  #5 (permalink)  
Старый 21.11.2014, 15:29
Кандидат Javascript-наук
Отправить личное сообщение для iNfantry Посмотреть профиль Найти все сообщения от iNfantry
 
Регистрация: 29.10.2011
Сообщений: 132

Всё, разобрался сам! Надо в каждый агрегат ДИСТИНКТ вставить и всё как надо работает!
Ответить с цитированием
  #6 (permalink)  
Старый 21.11.2014, 15:33
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,205

Сообщение от iNfantry
только не слишком ли это накладно для такой простой задачи?
На то всегда много дебатов...
Ответить с цитированием
  #7 (permalink)  
Старый 21.11.2014, 15:36
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,205

iNfantry, как вариант можно взять табличку с самым большим количеством записей... Сгруппировать по полю cat_id... А вторую "подключить" вложеным селектом...

Но так есть риск, что не все ИД из таблицы cat будут отображены в результате...
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с радио кнопками px379 Общие вопросы Javascript 8 29.07.2013 09:30
Проблема с загрузкой Store в grid (c группировкой) AndreiVadimovich ExtJS 1 03.10.2011 08:29
Установка JDBC Driver для SQL grim Общие вопросы Javascript 2 22.11.2010 08:20
Проблема с дизайном после отправки xmlhttprequest, Проблема с дизайном после отправки cyberx AJAX и COMET 3 01.05.2010 17:07
Проблема, в менюшке Большой джо Элементы интерфейса 0 12.07.2009 17:12