Страница 1 из 1

динамически изменяемое имя таблицы

Добавлено: 2011-10-10 16:50:16
Alex Keda

Код: Выделить всё

SELECT * FROM CONCAT('Hosting','Orders') WHERE 1
а почему не канает такой запрос?

в oracle - прокатывает =((

Re: динамически изменяемое имя таблицы

Добавлено: 2011-10-12 19:25:52
zg

Код: Выделить всё

mysql> set @query=concat("show tables from ", database(), ";");
Query OK, 0 rows affected (0.00 sec)

mysql> prepare stm from @query;
Query OK, 0 rows affected (0.00 sec)
Statement prepared

mysql> execute stm;
+---------------------------+
| Tables_in_mysql           |
+---------------------------+
| columns_priv              |
| db                        |
| event                     |
| func                      |
| general_log               |
| help_category             |
| help_keyword              |
| help_relation             |
| help_topic                |
| host                      |
| ndb_binlog_index          |
| plugin                    |
| proc                      |
| procs_priv                |
| servers                   |
| slow_log                  |
| tables_priv               |
| time_zone                 |
| time_zone_leap_second     |
| time_zone_name            |
| time_zone_transition      |
| time_zone_transition_type |
| user                      |
+---------------------------+
23 rows in set (0.00 sec)

mysql>
Alex Keda писал(а):а почему не канает такой запрос?
слишком банально

http://dev.mysql.com/doc/refman/5.0/en/ ... ments.html

Re: динамически изменяемое имя таблицы

Добавлено: 2011-10-12 22:20:46
FiL
ага, попробовал по первому примеру... как параметр к POW (или другой функции) так можно ? поставить. А как в качестве названия таблицы - так хрен. Не дает потом prepare сделать.

Код: Выделить всё

set @s = 'select user from ?;';
prepare stmt from @s;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?' at line 1
А в третьем примере уже неаккуратно. Сначала он задает переменную @table а только потом подготавливает statement. А вот приготовить запрос, а потом его вызывать с разными параметрами (using... ) не получается :(

Re: динамически изменяемое имя таблицы

Добавлено: 2011-10-13 9:46:16
Gloft

Код: Выделить всё

SELECT * FROM (SELECT CONCAT('Hosting','Orders')) AS t WHERE 1
Вроде так должно работать.

Re: динамически изменяемое имя таблицы

Добавлено: 2011-10-13 16:44:14
zg
Gloft писал(а):Вроде так должно работать.
а проверить не? :roll:

Код: Выделить всё

mysql> select * from (select "help_topic") as t where 1;
+------------+
| help_topic |
+------------+
| help_topic |
+------------+
1 row in set (0.00 sec)
FiL писал(а):как параметр к POW (или другой функции) так можно ? поставить
-))) prepare несколько отличается от printf логической нагрузкой

Re: динамически изменяемое имя таблицы

Добавлено: 2011-10-13 19:14:07
Alex Keda

Код: Выделить всё

mysql> SELECT * FROM (SELECT CONCAT('Hosting','Orders')) AS t WHERE 1;                                                                                                                                                           
+----------------------------+                                                                                                                                                                                                   
| CONCAT('Hosting','Orders') |                                                                                                                                                                                                   
+----------------------------+                                                                                                                                                                                                   
| HostingOrders              |                                                                                                                                                                                                   
+----------------------------+                                                                                                                                                                                                   
1 row in set (0.00 sec)                                                                                                                                                                                                          

mysql> 
а должно было выдать 5k записей из таблицы =))

Re: динамически изменяемое имя таблицы

Добавлено: 2011-10-13 19:15:56
Alex Keda
мне надо одним запросом сделать.
таковы ограничения используемого движка.

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

вот так запросы в итоге выглядят, когда в БД уходят

Код: Выделить всё

SELECT `ID`,`UserID`,`OrderDate`,`StatusID`,`StatusDate`,
(SELECT `Services`.`Code` FROM `Services` WHERE `OrdersOwners`.`ServiceID` = `Services`.`ID`) AS `OrderTypeCode`, ID as `Number`,
(SELECT `Services`.`Item` FROM `Services` WHERE `OrdersOwners`.`ServiceID` = `Services`.`ID`) as `OrderType`,
(SELECT `Email` FROM `Users` WHERE `UserID` = `Users`.`ID`) as `Owner`,StatusID as `Status`,UNIX_TIMESTAMP() - `StatusDate` as `StatusOver`
FROM `OrdersOwners` WHERE (`StatusID` IS NOT NULL AND `OrderDate` > BEGIN_WEEK()) GROUP BY `ID` ORDER BY `OrderDate` DESC LIMIT 0, 20
вот это

Код: Выделить всё

(SELECT `Services`.`Item` FROM `Services` WHERE `OrdersOwners`.`ServiceID` = `Services`.`ID`) as `OrderType`,
те самые хаки.
и вот такими рамками я и ограничен

Re: динамически изменяемое имя таблицы

Добавлено: 2011-10-14 5:27:08
zg
Alex Keda писал(а):а должно было выдать 5k записей из таблицы =))
select * from (...) - это выборка из результатов подзапроса, это не то, что требуется
Alex Keda писал(а):мне надо одним запросом сделать.
тогда можно использовать хранимую процедуру

Re: динамически изменяемое имя таблицы

Добавлено: 2011-10-14 8:27:22
hizel
говорили же тебе, mysql это не СУБД

Re: динамически изменяемое имя таблицы

Добавлено: 2011-10-14 12:31:30
Gamerman
Сформировать нужную строку и отправить строку-запрос. Или это нужно в мускулевских скриптах замутить?

Re: динамически изменяемое имя таблицы

Добавлено: 2011-10-14 13:29:55
Alex Keda
Gamerman писал(а):Сформировать нужную строку и отправить строку-запрос. Или это нужно в мускулевских скриптах замутить?
я ограничен строкой, типа вот этой:

Код: Выделить всё

(SELECT `Services`.`Item` FROM `Services` WHERE `OrdersOwners`.`ServiceID` = `Services`.`ID`) as `OrderType`
я могу подсосать в запрос любые таблицы и колонки, но выборка должна быть именно тут, и вернуть должна одно поле.

у меня вот такое получилось, но - пришлось оставить закомменченым, поскольку не работает

Код: Выделить всё

<!-- не работает в MySQL. А вот в Oracle - такой фокус прокатывает
     <ListElement>(SELECT ID FROM CONCAT((SELECT `Services`.`Code` FROM `Services` WHERE `OrdersOwners`.`ServiceID` = `Services`.`ID`),'Orders'),`tbl` WHERE `tbl`.`OrderID` = `OrdersOwners`.`ID`) AS ServiceOrderID</ListElement> -->

Re: динамически изменяемое имя таблицы

Добавлено: 2011-10-14 13:34:31
Gamerman

Код: Выделить всё

FROM CONCAT
Мускуль считает CONCAT как имя таблицы. То есть, все что идет после фром и не есть обратным апострофом - имя таблицы.
В общем случае, запрос к СУБД все равно идет в виде строки, по этому лучше сформировать нужную-строку запрос и с помощью определенных функций отправить на СУБД.

Re: динамически изменяемое имя таблицы

Добавлено: 2011-10-17 23:03:34
Alex Keda
просто пришлось на каждый вызов прилепить враппер, который дёргает базу и достаёт нужную строку
много запросов...
хотелось прямое решение

Re: динамически изменяемое имя таблицы

Добавлено: 2011-10-22 6:52:07
zg
Alex Keda писал(а):хотелось прямое решение
вызов процедуры и есть прямое решение