2015-02-13 3 views
0

Я пытаюсь использовать локальную переменную, чтобы сохранить значение для счетчика пользователей, чтобы рассчитать соотношение между текущим счетчиком и значением предыдущего.Локальная переменная Mysql не обновляется

Я использую этот запрос:

SET @count = 0; 

SELECT DATE_FORMAT(ual.time, "%M, %Y") as monthName, 

@count as beforeCount, 

count(DISTINCT ual.user_id)/@count as progress, 

@count := count(DISTINCT ual.user_id) as afterCount 

FROM user_activity_log ual 

LEFT OUTER JOIN user u 

ON u.gym = 22 

LEFT OUTER JOIN (SELECT ualWeek.user_id FROM user_activity_log ualWeek 

GROUP BY FROM_DAYS(TO_DAYS(ualWeek.time) -MOD(TO_DAYS(ualWeek.time) -1, 7)), ualWeek.user_id 

HAVING count(ualWeek.user_id) > 1) weekUsers 

ON u.id = weekUsers.user_id 

LEFT OUTER JOIN (SELECT ualMonth.user_id FROM user_activity_log ualMonth 

GROUP BY DATE(DATE_FORMAT(ualMonth.time, "%Y-%m-01")), ualMonth.user_id 

HAVING count(ualMonth.user_id) > 5) monthUsers 

ON u.id = monthUsers.user_id 

WHERE 

(ual.user_id = weekUsers.user_id OR ual.user_id = monthUsers.user_id) AND 

((ual.time BETWEEN '2014-02-13' AND '2015-02-13') OR (('2014-02-13' IS NULL) OR ('2015-02-13' IS NULL))) 

GROUP BY DATE(DATE_FORMAT(ual.time, "%Y-%m-01")) 

Моя проблема заключается в том, что @count не обновляет себя. Это мой результат: enter image description here

Если я отредактировав свой запрос и удалю мои присоединения, его рабочий режим прекрасен. Новый запрос:

SET @count = 0; 

SELECT DATE_FORMAT(ual.time, "%M, %Y") as monthName, 

@count as beforeCount, 

count(DISTINCT ual.user_id)/@count as progress, 

@count := count(DISTINCT ual.user_id) as afterCount 

FROM user_activity_log ual 

WHERE 

((ual.time BETWEEN '2014-02-13' AND '2015-02-13') OR (('2014-02-13' IS NULL) OR ('2015-02-13' IS NULL))) 

GROUP BY DATE(DATE_FORMAT(ual.time, "%Y-%m-01")) 

enter image description here

  • Мой вопрос почему это происходит и как я могу держать мои соединения и до сих пор мой @counter

ответ

0

Поведение определяется пользователем переменные не гарантируется с инструкцией SELECT, как вы ее используете.

Отрывок из раздела «9.4 Пользовательские переменные» в MySQL 5.5 Справочное руководство

Для других заявлений, таких как SELECT, вы можете получить результаты, которые вы ожидаете, но это не гарантируется. В следующем заявлении, вы можете подумать, что MySQL будет оценивать @a первый, а затем сделать задание второй:

SELECT @a, @a:[email protected]+1, ...;

Однако, порядок вычисления выражений, включающих пользовательские переменные не определено.

Ссылка: http://dev.mysql.com/doc/refman/5.5/en/user-variables.html


Вы можете попробовать (без гарантии) упаковка селектов с стыками в круглых скобках, и он используется в качестве вложенного представления для другого запроса. По крайней мере, по версии 5.5 результаты этого запроса материализуются как производная таблица, а внешний запрос выполняется против этого.

Подход заключается в том, чтобы получить набор результатов в производную таблицу, а затем запустить внешний запрос, который использует пользовательскую переменную, чтобы «сохранить» значение из предыдущей строки. Опять же, никаких гарантий, но это может сработать для вас:

SELECT DATE_FORMAT(d.dt, '%M, %Y') AS monthName 
    , d.cnt/@prev_count   AS progress 
    , @prev_count := d.cnt  AS cnt 
    FROM (SELECT @prev_count := 0) i 
    JOIN (SELECT DATE(DATE_FORMAT(ual.time, '%Y-%m-01')) AS dt 
       , COUNT(DISTINCT ual.user_id)    AS cnt 
      FROM user_activity_log ual 
      LEFT 
      JOIN user u 
      ON u.gym = 22 
      LEFT 
      JOIN (SELECT ualWeek.user_id 
        FROM user_activity_log ualWeek 
        GROUP 
         BY FROM_DAYS(TO_DAYS(ualWeek.time) -MOD(TO_DAYS(ualWeek.time) -1, 7)) 
         , ualWeek.user_id 
        HAVING COUNT(ualWeek.user_id) > 1 
       ) weekUsers 
      ON weekUsers.user_id = u.id 
      LEFT 
      JOIN (SELECT ualMonth.user_id 
        FROM user_activity_log ualMonth 
        GROUP 
         BY DATE(DATE_FORMAT(ualMonth.time, '%Y-%m-01')) 
         , ualMonth.user_id 
        HAVING COUNT(ualMonth.user_id) > 5 
       ) monthUsers 
      ON monthUsers.user_id = u.id 
      WHERE (ual.user_id = weekUsers.user_id OR ual.user_id = monthUsers.user_id) 
      AND ((ual.time BETWEEN '2014-02-13' AND '2015-02-13') OR (('2014-02-13' IS NULL) OR ('2015-02-13' IS NULL))) 
      GROUP BY DATE(DATE_FORMAT(ual.time, '%Y-%m-01')) 
      ORDER BY DATE(DATE_FORMAT(ual.time, '%Y-%m-01')) 
     ) d 
+0

Так как я могу это решить? – dasdasd

+0

Я видел, как вы редактировали, его все еще не работает. – dasdasd

Смежные вопросы