【问题标题】:Using column name as table in MySQL query在 MySQL 查询中使用列名作为表
【发布时间】:2013-07-24 00:05:21
【问题描述】:

我有一个数据库,其中一个表中的列是我需要在其中查找相应记录的表名。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| TABLE questions                                                                                                                                                                                 |
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| Field                   | Type                                                                                                                                                                  |
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| question_id             | int(11)                                                                                                                                                               |
| question_response_table | enum('question_responses_datetime','question_responses_int','question_responses_float','question_responses_bool','question_responses_text','question_responses_enum') |
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

question_response_table 列中的每个值都是另一个保存用户响应的表(原始数据库设计要求将响应按数据类型分离到单独的表中)。

我有一个查询,它可以得到我需要的一切,除了用户的响应。但是出于性能原因(数据库每年都在显着增长),我真的很想将该响应添加到相同的查询中。这是我想做的一个例子:

SELECT cr.category_id, cr.category_response_id, r.response 
FROM category_responses AS cr 
JOIN response_key_questions AS rkq ON cr.category_id = rkq.category_id 
JOIN questions AS q ON q.question_id = rkq.question_id
JOIN {q.question_response_table} AS r ON r.category_response_id = cr.category_response_id 
WHERE cr.belongs_to = 4 AND cr.reporting_year_id = 1 AND cr.date_retired IS NULL 
ORDER BY cr.category_id

【问题讨论】:

  • 你想要像eval() 这样的东西,它在SQL 中不存在,而且有充分的理由;模式的全部意义在于它严格定义了各种数据之间可能存在的关系,并且允许使用任意字符串作为列名或表名使得这是一项不可能完成的任务。您最好使用单个表中的响应进行重构,并根据外键定义关系,但如果您不能这样做,那么您可能会发现一些有用的东西here
  • @eggyal 不幸的是,我没有选择数据库的设计方式,它就是这样,到目前为止有数十万条记录
  • @AaronMiller 我尝试了类似的东西,MySQL 抱怨变量中有多个值

标签: mysql


【解决方案1】:

这会变得如此丑陋。最好创建一个 CREATE VIEW,将 response 列添加到 cr 表中。

SELECT cr.category_id, cr.category_response_id,
    CASE 
    WHEN q.question_response_table = '...' THEN
        (SELECT response
         FROM ... r
         WHERE r.category_response_id = cr.category_response_id)
    ... 
    ELSE '' 
    END AS response
FROM category_responses AS cr 
JOIN response_key_questions AS rkq ON cr.category_id = rkq.category_id 
JOIN questions AS q ON q.question_id = rkq.question_id
WHERE cr.belongs_to = 4 AND cr.reporting_year_id = 1 AND cr.date_retired IS NULL 
ORDER BY cr.category_id

【讨论】:

  • 不是最干净的方法,但它适用于我的情况。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-08
  • 2014-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多