MySQL函数返回查询中使用的表名

MySQL函数返回查询中使用的表名,mysql,stored-procedures,function,defined,Mysql,Stored Procedures,Function,Defined,我可以使用MySQL函数或过程返回可用于查询的表名吗 差不多 从get_db_table_name(2342352412)中选择* 其中get\u db\u table\u name()是一个用户定义的函数,它接受user\u id作为参数,并返回该用户所在的db.table。我不能这样做,因为MySQL抱怨语法(我猜这是因为我必须为函数定义一个返回类型,我尝试了VARCHAR(30),这是错误的或不可能的)。那么,这可能吗 故事是我有一些基本上是碎片的数据库。让我们称他们为user\u 1,u

我可以使用MySQL函数或过程返回可用于查询的表名吗

差不多

从get_db_table_name(2342352412)中选择*

其中
get\u db\u table\u name()
是一个用户定义的函数,它接受
user\u id
作为参数,并返回该用户所在的db.table。我不能这样做,因为MySQL抱怨语法(我猜这是因为我必须为函数定义一个返回类型,我尝试了
VARCHAR(30)
,这是错误的或不可能的)。那么,这可能吗

故事是我有一些基本上是碎片的数据库。让我们称他们为
user\u 1
user\u 2
,等等

我还有一个表,比如
emails
,其中包含表
user\u 1.users
user\u 2.users
中的
user\u id
记录

因为我知道一种通过查看id来计算id来自哪个表的方法,所以我只需要一个函数,该函数将接受输入并返回要使用的db.table名称

谢谢大家!

另外,我想使用上面的SELECT查询作为视图定义,通过在适当的表之间进行连接,将用户名从适当的db/表中带出。

您可以使用它,例如:

....
SET @tbl = 'nameofmytable';
SET @sql = CONCAT( 'SELECT * FROM ', @tbl );
EXECUTE @sql;
...

定义视图时,必须指定表。您不能在“从需要的位置选择”上定义视图

视图定义在创建时“冻结”,因此之后对基础表的更改不会影响视图定义。例如,如果在表中将视图定义为SELECT*,则以后添加到表中的新列不会成为视图的一部分

您必须指定我的视图位于此、此和此表上。鉴于此,您无法从func(id)中选择*,因为您无法指定此函数的结果(取决于输入参数)

SELECT的语法是

从表_参考中选择*

“动态”选择的唯一方法是使用动态SQL,@Zed回答的


如果我的回答不完整,我很抱歉,但我不知道你的问题的细节。祝你好运

表名的参数化是。是否真的不可能将同一类型的所有实体(在本例中是您的用户)都放在一个表中?

我认为这在视图声明中是行不通的(请参阅本文的p.S.)。你能提供一个视图定义吗?我想说,将CREATE视图连接到@sql也不是问题。好吧,这个想法是为了显示正确的用户名,这意味着视图必须知道要查看哪个表。到目前为止,我的最佳解决方案涉及到与我有用户表一样多的左连接(dev env只有2个,所以它有点可行),然后是一个大的if语句,它从相应的表中输入名称。不过我想做得更优雅一些。