【问题标题】:A single MySQL query for 'bouncing' table selects用于“弹跳”表选择的单个 MySQL 查询
【发布时间】: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...所以使用它而不是通过运行子字符串函数来进行索引查找来浪费它的潜在能力。

标签: database mysql


【解决方案1】:

我喜欢这种方法的纯粹性,如果成功的话。但我认为你正在制造一个维修炸弹。有了这样的治疗方法,谁需要生病?

从来没有人说过一个网站“伙计,他们的数据肯定是纯净的!”他们称赞正在使用数据所做的事情。我不建议您将双手绑在背后。我保证你的竞争对手不是。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多