SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 28.01.2013 14:16:18

Jops
Участник
Зарегистрирован: 28.01.2013
Сообщений: 8

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

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

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

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 не перестаёт удивлять (или это просто создатель запроса где-то сильно затупил). Если кто сможет помочь, буду чрезвычайно благодарен!

Отредактированно Jops (28.01.2013 14:25:04)

Неактивен

 

#2 28.01.2013 14:31:50

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

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

1) Для чего в запросе
                  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

2) зачем выбираются                 crg.cam_id ,  crg.rule_status,
посмотрите FAQ №16

Неактивен

 

#3 28.01.2013 14:55:42

Jops
Участник
Зарегистрирован: 28.01.2013
Сообщений: 8

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

1)
group_id     rule_status        cnt

1                  0                    1
1                  1                    2
16                0                    1
17                2                    2

Результат получается примерно такого типа. То есть у group_id = 1 rule_status со значением "0" одна штука, со значением "1" два штуки и тд...

2)
crg.cam_id - это ID камеры (может быть не уникальным). Может быть cam_id = 2 (или любой другой ID) rule_status = 0, cam_id = 2 rule_status = 1, cam_id = 2 rule_status = 2
crg.rule_status - это статус камеры. Имеет три значения (0, 1, 2). У одного group_id может быть cam_id = 2 (например) только с одним из значений rule_status (или 1 или 2 или 0)

Неактивен

 

#4 28.01.2013 15:18:21

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

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

SELECT tt.*, c.group_name FROM
(SELECT      t.group_id,
                SUM(IF(t.rule_status = 0, cnt, 0)) as res_dlw,
                SUM(IF(t.rule_status = 1, cnt, 0)) as res_alw,
                SUM(IF(t.rule_status = 2, cnt, 0)) as res_ono
FROM
(SELECT group_id, rule_status, COUNT(*) as cnt FROM cams_rules_groups GROUP BY 1, 2) t
GROUP BY 1) tt
JOIN cams_groups c ON tt.group_id=c.group_id;
 

Неактивен

 

#5 28.01.2013 15:33:54

Jops
Участник
Зарегистрирован: 28.01.2013
Сообщений: 8

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

Ну это просто мана небесная!! Огромнейшее спасибо! Думал уже забросить, а тут такое. group_name правда клеится слева по краю, а не после group_id (надо будет обмозговать). Но Вашей заслуги это не умиляет! Ещё раз спасибо)

Неактивен

 

Board footer

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