2016-02-10 3 views
0

Я пытаюсь создать представление следующим образом:Можно ли использовать переменную или параметр в представлении MySQL?

CREATE VIEW v_MyView 
AS 

SET @par_count := 0; -- XXX Working in SELECT, but not in a View !? XXX 

SELECT 
    q1.day, 
    q1.count_per_day, 
    (@par_count := @par_count + q1.count_per_day) AS count_sum -- sums up count_per_day 
FROM 
    (SELECT 
     DATE(registration_date_time_obj) AS day, 
     COUNT(Date(registration_date_time_obj)) AS count_per_day 
    FROM tbl_registration_data 
    GROUP BY day 
    ORDER BY day 
    ) AS q1 
; 

Сам оператор выбора отлично работает, просто создавая вид терпит неудачу в MySQL, так как он не принимает пользовательские переменные/параметры в это декларации я думаю.

Есть ли способ создать этот вид с обходным путем для параметра?

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

Спасибо для ваших предложений и решений! (:

+0

Для этой цели мы предоставляем только функции. Попробуйте создать функцию, чтобы ее можно было использовать в инструкции select. –

ответ

2

MySQL documentation довольно ясно, что переменные не допускаются:.

  • SELECT, оператор не может ссылаться на системных переменных или определяемых пользователем переменных

  • В хранимой программой, Оператор SELECT не может ссылаться на параметры программы или локальные переменные.

Вы можете делать то, что вы хотите использовать связанный подзапрос:

SELECT DATE(registration_date_time_obj) AS day, 
     COUNT(Date(registration_date_time_obj)) AS count_per_day, 
     (SELECT COUNT(*) 
     FROM tbl_registration_data rd2 
     WHERE rd2.registration_date_time_obj <= date_add(date(rd.registration_date_time_obj), interval 1 day) 
FROM tbl_registration_data rd 
GROUP BY day 
ORDER BY day; 
+0

Почти! ;) строка 'WHERE rd2.reg ...' не работает. Однако, если я просто использую 'WHERE rd2.registration_date_time_obj <= rd.registration_date_time_obj', он отлично работает. – webMac

+0

Теперь, если мне нужно другое ограничение 'WHERE ...' в обоих операторах SELECT, как бы это получилось, поскольку установка WHERE на выбор VIEW ограничивает выбор outter ...:? – webMac

+0

@webMac. , , Вероятно, вам нужно будет поместить условия 'where' в подзапрос, а также внешний запрос. –

2

Пожалуйста, прочтите документацию по ВИДУ >>https://dev.mysql.com/doc/refman/5.5/en/create-view.html

Определение мнения подлежит следующие ограничения:

  • Оператор SELECT не может содержать подзапрос в предложении FROM.

  • Оператор SELECT не может ссылаться на системные переменные или определяемые пользователем переменные.

  • В хранимой программе оператор SELECT не может ссылаться на параметры программы или локальные переменные .

  • Оператор SELECT не может ссылаться на подготовленные параметры инструкции.

  • Любая таблица или вид, упомянутые в определении, должны существовать. После того, как было создано представление , можно отбросить таблицу или представление, которое относится к . В этом случае использование результатов просмотра в ошибке . Чтобы проверить определение вида для таких проблем, используйте оператор CHECK TABLE.

  • Это определение не может относиться к таблице ВРЕМЕННЫХ, и вы не можете создать ВРЕМЕННОЕ представление.

  • Вы не можете связать триггер с видом.

  • Псевдонимы для имен столбцов в инструкции SELECT проверяются на максимальную длину столбца 64 символа (не максимальный псевдоним длиной 256 символов).