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

MySQL/PostgreSQL/SQLite/Oracle/M$SQL/....

Модератор: terminus

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35456
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

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

Непрочитанное сообщение Alex Keda » 2011-10-10 16:50:16

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

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

в oracle - прокатывает =((
Убей их всех! Бог потом рассортирует...

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

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

Непрочитанное сообщение zg » 2011-10-12 19:25:52

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

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

FiL
ст. лейтенант
Сообщения: 1375
Зарегистрирован: 2010-02-05 0:21:40

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

Непрочитанное сообщение FiL » 2011-10-12 22:20:46

ага, попробовал по первому примеру... как параметр к 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... ) не получается :(

Gloft
лейтенант
Сообщения: 645
Зарегистрирован: 2008-03-09 11:32:12
Откуда: Москва

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

Непрочитанное сообщение Gloft » 2011-10-13 9:46:16

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

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

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

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

Непрочитанное сообщение zg » 2011-10-13 16:44:14

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 логической нагрузкой

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35456
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

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

Непрочитанное сообщение Alex Keda » 2011-10-13 19:14:07

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

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

mysql> 
а должно было выдать 5k записей из таблицы =))
Убей их всех! Бог потом рассортирует...

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35456
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

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

Непрочитанное сообщение Alex Keda » 2011-10-13 19:15:56

мне надо одним запросом сделать.
таковы ограничения используемого движка.

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

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

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

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`,
те самые хаки.
и вот такими рамками я и ограничен
Убей их всех! Бог потом рассортирует...

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

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

Непрочитанное сообщение zg » 2011-10-14 5:27:08

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

Аватара пользователя
hizel
дядя поня
Сообщения: 9032
Зарегистрирован: 2007-06-29 10:05:02
Откуда: Выборг

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

Непрочитанное сообщение hizel » 2011-10-14 8:27:22

говорили же тебе, mysql это не СУБД
В дурацкие игры он не играет. Он просто жуткий, чу-чу, паровозик, и зовут его Блейн. Блейн --- это Боль.

Аватара пользователя
Gamerman
капитан
Сообщения: 1723
Зарегистрирован: 2009-05-17 21:01:23
Откуда: Украина, Ужгород - Днепр
Контактная информация:

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

Непрочитанное сообщение Gamerman » 2011-10-14 12:31:30

Сформировать нужную строку и отправить строку-запрос. Или это нужно в мускулевских скриптах замутить?
Глюк глюком вышибают!

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35456
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

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

Непрочитанное сообщение Alex Keda » 2011-10-14 13:29:55

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> -->
Убей их всех! Бог потом рассортирует...

Аватара пользователя
Gamerman
капитан
Сообщения: 1723
Зарегистрирован: 2009-05-17 21:01:23
Откуда: Украина, Ужгород - Днепр
Контактная информация:

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

Непрочитанное сообщение Gamerman » 2011-10-14 13:34:31

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

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

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35456
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

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

Непрочитанное сообщение Alex Keda » 2011-10-17 23:03:34

просто пришлось на каждый вызов прилепить враппер, который дёргает базу и достаёт нужную строку
много запросов...
хотелось прямое решение
Убей их всех! Бог потом рассортирует...

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

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

Непрочитанное сообщение zg » 2011-10-22 6:52:07

Alex Keda писал(а):хотелось прямое решение
вызов процедуры и есть прямое решение