单个MySQL查询'bouncing'表选择

时间:2009-12-01 23:34:33

标签: database mysql

所以,为了简单起见,我有一个包含两个字段的主表 - 第一个是属性,第二个是属性值。如果第二个字段设置为引用另一个表中的值,则在括号中表示。

示例:

                 MASTER_TABLE:
Attr_ID |  Attr_Val
--------+-----------
   1    | 23(table1)   --> 23rd value from `table1`
   2    | ...
   1    | 42           --> the number 42
   1    | 72(table2)   --> 72nd value from `table2`
   3    | ...
   1    | txt          --> string "txt"
   2    | ...
   4    | ...


                 TABLE 1:
 Val_Id |  Value
--------+-----------
   1    | some_content
   2    | ...
   .    | ...
   .    | ...
   .    | ...
  23    | some_content
   .    | ...

是否可以在SQL中执行单个查询(不解析应用程序内部的结果并重新查询数据库),这将通过master_table迭代,并且对于给定的<attr_id>只获取引用其他表的属性(例如23(table1),72(table2),... ),然后从括号中解析表名(例如table1,table2,... < / em>)并执行查询以从该引用的表中获取( 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

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我喜欢这种方法的纯度,如果被拉下来的话。但我在想你是在制造维修炸弹。有了这样的治疗方法,谁需要生病?

没有人曾经说过一个网站“男人,他们的数据肯定是纯粹的!”他们赞扬了对数据的处理方式。我不建议你把双手绑在背后。我保证你的竞争对手不是。