Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1
Привет всем! Опишу свою проблему. И прошу у вас помощи.
У меня данные на стороне сервера для подготовки диаграмм подготавливаются по следующей механике SQL-запросов вида:
SELECT t1.col1, t2.col2, t3.col3
FROM
(SELECT cc AS col1
FROM a
WHERE cc=bb) AS t1,
(SELECT cc AS col2
FROM a
WHERE cc=dd) AS t2,
(SELECT cc AS col3
FROM a
WHERE cc=ee) AS t3
Где “a” это таблица с исходными данными, вычисляемая ресурсоёмким SQL-запросом (он может считаться довольно долго, от 10 до 400+ секунд). В данном примере видно что условий несколько, и запрос “a” для каждого из них вычисляется три раза, что является неэффективным (данные в нём всё равно получаются одни и теже).
Предлагается подсчет SQL-запроса “a” считать один раз и сохранять его во временной таблице.
Здесь появляются две проблемы:
1. Очевидное решение известно, есть например в такой реализации:
DECLARE @temp TABLE(
ID INT,
UnitName nvarchar(255)
);
(подготовлена временная таблица, в которую будем сохранять результаты запроса)
INSERT INTO @temp
SELECT UnitID, UnitName FROM dbo.Units WHERE UnitName = N OR UnitName = N
(Положили во временную таблицу ресурсоёмкий запрос)
SELECT (SELECT ID FROM @temp WHERE UnitName = N), (SELECT ID FROM @temp WHERE UnitName = N)
(используем результаты запроса @temp несколько раз, не считая их каждый раз заново)
Однако это красивое решение будет работать в реализации Oracle, и не будет применимо к нашей MySQL базе.
В MySQL операнд DECLARE к сожалению с типом TABLE не работает.
Аналогом ораклового DECLARE @temp TABLE в MySQL является операнд CREATE TEMPORARY TABLE temp.
2. Мои акаунты под которым выполняются все действия в базах данных не имеют права создавать новые таблицы (даже временные), они являются read-only, поэтому возможность сохранять результат SQL-запроса во временную таблицу отсутсвует. Использовать акаунты с полными правами является небезопасной возможностью, и не рекомендуется.
Подскажите как быть. Очень нужно.
Неактивен
Можно решать данную задачу с помощью хранимой процедуры, у которой будут права создателя. Тогда создавать временные таблицы сможет только данная процедура и с безопасностью всё будет в порядке
http://dev.mysql.com/doc/refman/5.5/en/ … edure.html
Неактивен
Спасибо.
А можно тривиальный рабочий пример привести? Желательно как вы это понимаете. Что бы в процедуре создавалась CREATE TEMPORARY TABLE или CREATE VIEW. В доках процедуре передают DEFINER, который является админским акаунтом, и процедура выполняется с его правами. У меня же есть только рид-онли акаунт, которому запрещено создавать временные тейблы и вьюшки.
Неактивен
Естественно вам придется завести аккаунт, имеющий права на создание временных таблиц. Собственно с рид-онли аккаунтом вы и хранимую процедуру создать не сможете
Неактивен
Тогда задам следующий вопрос, в продолжении поиска решений моей проблемы.
А есть множественный CASE в MySQL, скорее аналог CASE, но только для WHERE? Множественный WHERE точнее.
мне нужно вывести такую штуку:
SELECT
Week,
COUNT(a) as aaa1,
COUNT(a) as aaa2
FROM
(
...
)
WHERE
b<1 (для расчета aaa1)
b>2 (для расчета aaa2)
Как это лучше реализовать?
Неактивен
Можно так
Неактивен
to evgeny
That's greate!
It's works correctly.
Thank u!
Отредактированно SpaceQuester (14.06.2012 12:43:37)
Неактивен
Страниц: 1