【问题标题】:Get Value of Column Whose Name is Result of Second Query获取名称为第二次查询结果的列的值
【发布时间】:2018-01-15 05:12:08
【问题描述】:

我有一个包含许多列的表。每个都代表它所代表的数据的特定“场景”。看起来像这样:

id | col1   | col2   | col3   | col4    | col5    
---+--------+--------+--------+---------+---------
1  | 1200   | 100    | 1200   | 10000   | 1300   
2  | 100    | 1400   | 2300   | 1200    | 900     
3  | 3300   | 1200   | 400    | 600     | 12000   

我有另一个存储实体的表和一个存储该实体的默认方案的列。看起来像这样:

id | city       | state | default_scenario 
---+------------+-------+-------------------
1  | Miami      | FL    | col3
2  | Detroit    | MI    | col2
3  | New York   | NY    | col1

我想从第二个表中获取结果并从第一个表中返回值,根据该行的default_scenario 是什么,作为结果中的一个额外列。

我认为这可以通过 JOIN 来完成,但我如何在同一查询中使用一行的值作为另一行的列名,而不使用 PHP?

这可能吗?

我尝试进行的查询将返回:

id | city       | state | default_scenario | scenario_data
---+------------+-------+------------------+--------------- 
1  | Miami      | FL    | col3             | 1200
2  | Detroit    | MI    | col2             | 1400
3  | New York   | NY    | col1             | 3300

【问题讨论】:

  • 你不能直接用SQL ..你必须使用dinamic sql(服务器端生成的sql代码)

标签: mysql


【解决方案1】:

不,在一个查询中是不可能的。最好的办法是:

  • 使用两个查询
  • 从第一个查询结果中获取列名
  • 根据这些列名动态生成第二个查询

但是,如果您可以更改数据库设计,我建议将scenarios 提取到单独的表中,并在第一个表中添加scenario_id,而不是使用不同的列,即:

id  |  scenario_id  | value
1   |       3       | 1200  
2   |       2       | 1400 

【讨论】:

  • 这会使查询变慢吗?我问的唯一原因是因为我有大约 70,000 个不同的实体,每个实体都有 63 个不同的场景。这将在表中产生约 4,410,000 行(根据您建议的设计)。该数据还每年两次增加约 650.000。长期来看,行数可以达到10亿+
  • 看看this SO回答。通过上述设计,它将被规范化并且易于查询(在现有的设计中,如果要添加比方说20多个场景,最终将创建20个新列,从长远来看将难以维护)。
猜你喜欢
  • 1970-01-01
  • 2021-12-26
  • 2015-03-16
  • 2020-09-16
  • 1970-01-01
  • 1970-01-01
  • 2011-12-28
  • 2019-09-19
  • 1970-01-01
相关资源
最近更新 更多