【发布时间】:2009-12-03 09:41:36
【问题描述】:
所以,为了简单起见,我有一个包含两个字段的主表 - 第一个是属性,第二个是属性值。如果第二个字段设置为引用另一个表中的值,则在括号中表示。
例子:
MASTER_TABLE: 属性 ID | Attr_Val --------+------------ 1 | 23(table1) --> 来自 `table1` 的第 23 个值 2 | ... 1 | 42 --> 数字 42 1 | 72(table2) --> `table2` 中的第 72 个值 3 | ... 1 | txt --> 字符串“txt” 2 | ... 4 | ... 表格1: 验证码 |价值 --------+------------ 1 |一些内容 2 | ... . | ... . | ... . | ... 23 |一些内容 . | ...是否可以在 SQL 中执行 单个查询(无需解析应用程序内的结果并重新查询数据库),该查询将遍历 master_table 并且对于给定的<attr_id> 仅获取符合以下条件的属性引用其他表格(例如 23(table1)、72(table2)、...),然后从括号中解析表格名称(例如 table1、table2、...) 并执行查询以从该引用表中获取 (23rd, 72nd, ...) 值(例如 some_content)?
这是我所做的,它解析表名的 Attr_Val,但我不知道如何将其分配给字符串,然后使用该字符串进行查询。
PREPARE pstmt FROM
"SELECT * FROM information_schema.tables
WHERE TABLESCHEMA = '<my_db_name>' AND TABLE_NAME=?";
SET @str_tablename =
(SELECT table.tablename FROM
(SELECT @string:=(SELECT <string_column> FROM <table> WHERE ID=<attr_id>) as String,
@loc1:=length(@string)-locate("(", reverse(@string))+2 AS from,
@loc2:=length(@string)-locate(")", reverse(@string))+1-@loc1 AS to,
substr(@string,@loc1, @loc2) AS tablename
) table
); <--this returns 1 rows which is OK
EXECUTE pstmt USING @str_tablename; <--this then returns 0 rows
有什么想法吗?
【问题讨论】:
-
这个问题可以很容易地通过对表格的小更新来解决。你有一个强大的 RDBMS...所以使用它而不是通过运行子字符串函数来进行索引查找来浪费它的潜在能力。