SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

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

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

Вы не зашли.

#1 08.06.2012 17:33:55

SpaceQuester
Участник
Зарегистрирован: 08.06.2012
Сообщений: 5

Сохранение результата SQL запроса во временную таблицу.

Привет всем! Опишу свою проблему. И прошу у вас помощи.

У меня данные на стороне сервера для подготовки диаграмм подготавливаются по следующей механике 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-запроса во временную таблицу отсутсвует. Использовать акаунты с полными правами является небезопасной возможностью, и не рекомендуется.

Подскажите как быть. Очень нужно.

Неактивен

 

#2 08.06.2012 19:30:56

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

Re: Сохранение результата SQL запроса во временную таблицу.

Можно решать данную задачу с помощью хранимой процедуры, у которой будут права создателя. Тогда создавать временные таблицы сможет только данная процедура и с безопасностью всё будет в порядке
http://dev.mysql.com/doc/refman/5.5/en/ … edure.html

Неактивен

 

#3 09.06.2012 13:39:36

SpaceQuester
Участник
Зарегистрирован: 08.06.2012
Сообщений: 5

Re: Сохранение результата SQL запроса во временную таблицу.

Спасибо.

А можно тривиальный рабочий пример привести? Желательно как вы это понимаете. Что бы в процедуре создавалась CREATE TEMPORARY TABLE или CREATE VIEW. В доках процедуре передают DEFINER, который является админским акаунтом, и процедура выполняется с его правами. У меня же есть только рид-онли акаунт, которому запрещено создавать временные тейблы и вьюшки.

Неактивен

 

#4 09.06.2012 14:03:00

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

Re: Сохранение результата SQL запроса во временную таблицу.

Естественно вам придется завести аккаунт, имеющий права на создание временных таблиц. Собственно с рид-онли аккаунтом вы и хранимую процедуру создать не сможете smile

Неактивен

 

#5 13.06.2012 16:50:36

SpaceQuester
Участник
Зарегистрирован: 08.06.2012
Сообщений: 5

Re: Сохранение результата SQL запроса во временную таблицу.

Тогда задам следующий вопрос, в продолжении поиска решений моей проблемы.
А есть множественный CASE в MySQL, скорее аналог CASE, но только для WHERE? Множественный WHERE точнее.
мне нужно вывести такую штуку:
SELECT
Week,
COUNT(a) as aaa1,
COUNT(a) as aaa2
FROM
(
...
)
WHERE
b<1 (для расчета aaa1)
b>2 (для расчета aaa2)

Как это лучше реализовать?

Неактивен

 

#6 13.06.2012 22:10:56

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: Сохранение результата SQL запроса во временную таблицу.

Можно так


SELECT
       count(if(b<1,a,null)) aaa1,
       count(if(b>2,a,null)) aaa2
FROM mytable
WHERE b<1 OR b>2
 

Неактивен

 

#7 14.06.2012 12:43:05

SpaceQuester
Участник
Зарегистрирован: 08.06.2012
Сообщений: 5

Re: Сохранение результата SQL запроса во временную таблицу.

to evgeny

That's greate!
It's works correctly.

Thank u!

Отредактированно SpaceQuester (14.06.2012 12:43:37)

Неактивен

 

Board footer

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