Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.01.2013, 14:19   #1
Jopses
Пользователь
 
Регистрация: 03.02.2012
Сообщений: 39
По умолчанию Сложный запрос и Непредсказуемый результат (проблема с MySQL)

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

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

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

Последний раз редактировалось Jopses; 28.01.2013 в 14:24.
Jopses вне форума Ответить с цитированием
Старый 28.01.2013, 14:59   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Смотрим часть
Код:
           FROM cams_rules_groups
                RIGHT OUTER JOIN 
                    cams_groups as cg
                ON crg.group_id = cg.group_id
Как cams_rules_groups и cams_groups в ON увязаны друг с другом - никак. crg - это псевдоним подзапроса, который дальше фигурирует, но ни как не таблицы cams_rules_groups. Ниже фигурирует псевдоним crgg, который ни чего не идентифицирует. Этот запрос должен вообще на ошибку вываливаться
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 28.01.2013, 15:18   #3
Jopses
Пользователь
 
Регистрация: 03.02.2012
Сообщений: 39
По умолчанию

Согласен! Странно, но ошибки не выдаёт и запрос выполнят, но как я сказал выше "с проблемкой". Хотя с другой стороны cams_rules_groups и cams_groups ПОИМЕНОВАНЫ до того, как начали мелькать в ON. Так что спорно ваше утверждение. А crgg идентифицирует этот LEFT OUTER JOIN (...) запрос.
Jopses вне форума Ответить с цитированием
Старый 28.01.2013, 15:40   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А так
Код:
SELECT
    cg.group_id ,
    cg.group_name ,
    crg.cam_id ,      -- для чего выводить при таком GROUP BY не понятно
    crg.rule_status,  -- аналогично - в обоих случаях будет первое встреченное
    SUM(IF(crg.rule_status = 0, 1, 0)) as res_dlw,
    SUM(IF(crg.rule_status = 1, 1, 0)) as res_alw,
    SUM(IF(crg.rule_status = 2, 1, 0)) as res_ono
  FROM cams_groups cg
    LEFT JOIN cams_rules_groups crg ON crg.group_id=cg.group_id
  GROUP BY cg.group_id
Ваш запрос по определению не может выполняться
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 28.01.2013 в 15:43.
Аватар вне форума Ответить с цитированием
Старый 28.01.2013, 16:00   #5
Jopses
Пользователь
 
Регистрация: 03.02.2012
Сообщений: 39
По умолчанию

Даже если откинуть crg.cam_id , crg.rule_status (не вносить в запрос) то результат остаётся прежним
Jopses вне форума Ответить с цитированием
Старый 28.01.2013, 16:06   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Что-то не то. Покажите на примере реальных данных, где мой запрос что-то удваивает или утраивает с вашей точки зрения
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 28.01.2013, 16:15   #7
Jopses
Пользователь
 
Регистрация: 03.02.2012
Сообщений: 39
По умолчанию

Извините) Не так Вас понял) Всё отлично отрабатывается. Огромнейшее спасибо за помощь!
Jopses вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
сложный sql-запрос на mysql Cpluser Помощь студентам 2 24.11.2011 16:53
Сложный запрос для MySQL fioru SQL, базы данных 5 07.09.2011 22:45
Сложный запрос templton Microsoft Office Access 8 21.04.2011 13:43
Сложный запрос Kostya777 Microsoft Office Access 1 07.12.2010 12:02
Сложный запрос Lianchik Помощь студентам 1 01.03.2010 17:16