Сложный запрос и Непредсказуемый результат (проблема с MySQL)

SQL во всех проявлениях - от ANSI-92 до TSQL.

Модераторы: Yurich, Absurd

Ответить
Jops
Сообщения: 2
Зарегистрирован: 27 янв 2013, 04:43

28 янв 2013, 14:23

Здравствуйте Уважаемые!

Есть интересный запрос, который не даёт мне покоя уже неделю:

Код: Выделить всё

SELECT
                cg.group_id ,
                cg .group_name ,
                crg.cam_id ,
                crg.rule_status,
                SUM(IF(crg.rule_status = 0, cnt, 0)) as res_dlw,
                SUM(IF(crg.rule_status = 1, cnt, 0)) as res_alw,
                SUM(IF(crg.rule_status = 2, cnt, 0)) as res_ono
            FROM cams_rules_groups
                RIGHT OUTER JOIN 
                    cams_groups as cg
                ON crg.group_id = cg.group_id
                    LEFT OUTER JOIN  (
                        SELECT
                            crg.group_id ,
                            crg.rule_status,
                            COUNT(*) as cnt
                        FROM
                            cams_rules_groups as crg
                        GROUP BY crg.group_id , crg.rule_status
                    ) as crg ON crgg.group_id = crg.group_id
            GROUP BY    cg.group_id
Смысл вот в чём. Есть две таблицы: cams_groups (group_id, group_name) ; cams_rules_groups (group_id, cam_id, rule_status).

group_id - ID группы , group_name - Имя группы / group_id - ID группы (дублируется из таблицы cams_groups ), cam_id - цыфры (могут быть повторяющимися), rule_status - цыфры (значения только 0, 1, 2 или res_dlw, res_alw, res_ono соответственно).

В результате запрос выдаёт в JQuery таблицу типа group_id, group_name, rule_status
Где group_id и group_name - соответствуют оригиналу, а rule_status выдаёт res_dlw/res_alw/res_ono (число/число/число)

Число - это сумма значений из rule_status соответствующих res_dlw, res_alw, res_ono.
То есть если у одного group_id (например 5) с разными cam_id (например 2 и 15) одинаковые значение столбца rule_status res_dlw (это 0), то должно вывестись 2/0/0, а выводится 4/0/0.
Или например 2/1/0, а выводится 6/3/0.

Получается, что при подсчёте запрос помимо желаемого складывания ещё и умножает каждое значение на общую сумму res_dlw + res_alw + res_ono, то есть 2*3/1*3/0*3

Так что MySQL не перестаёт удивлять (или это просто создатель запроса где-то сильно затупил). Если кто сможет помочь, буду чрезвычайно благодарен!
Хыиуду
Сообщения: 2388
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

31 янв 2013, 10:25

Попробуйте сделать select * и посмотреть, из какого результирующего набора берутся данные. Возможно, некоторые строки просто дублируются.
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Ответить