将结果作为列名称加入

时间:2011-12-07 21:36:28

标签: mysql pivot-table

我有这个Mysql场景

table1
--------------
id   `7`   `8`
--------------
1    10    20
2    20    30

table 2
---------------
id  code   rel
---------------
3     7     1
4     8     2

我使用以下语句来获取值

SELECT t2.id, t2.code, 
CASE t2.code WHEN 7 THEN (SELECT `7` FROM table1 t1 where t1.id = t2.rel)
CASE t2.code WHEN 8 THEN (SELECT `8` FROM table1 t1 where t1.id = t2.rel) 
END as val
FROM table2 t2

但它既不漂亮也不实用,因为我需要这些值求和,乘以等,并且有很多列。

有没有办法连接这些表并获得t2.rel,t2.code值的table1。7值? 类似于

的东西
SELECT t2.id, t2.code, eval(t1.(t2.code))  as val
FROM table2 t2 
JOIN table1 t1 on t2.rel = t1.id

非常感谢!

3 个答案:

答案 0 :(得分:3)

准备查询时,必须修复SQL查询中引用的每一列。没有eval这样的东西。

但是,您可以使用数据值来驱动CASE语句:

SELECT t2.id, t2.code,
  CASE t2.code WHEN '7' THEN t1.`7` WHEN '8' THEN t1.`8` END AS `val`
FROM table2 t2
JOIN table1 t1 ON t2.rel = t1.id;

但是在准备查询之前,您必须对所有案例进行硬编码。 SQL在执行期间无法生成表达式,因为它在连续的数据行中找到新的code值。

答案 1 :(得分:1)

好的,我很好奇你是否有可能尝试做什么,但这可能是现在的解决方案。 选择这样的选择:

SELECT t2.id, t2.code, t1.*
FROM table2 t2 
JOIN table1 t1 on t2.rel = t1.id

导致

  || *id* || *code* || *id* || *7* || *8* ||
  ------------------------------------------
  || 3    || 7      || 1    || 10  || 20  ||
  || 4    || 8      || 2    || 20  || 30  ||

然后在你的代码中连接你的结果。 如果您使用php并且您的结果是关联的:

echo $result[$result['code']];

我不认为你会在查询中发生这种情况。您可能想重新考虑数据库设计。

答案 2 :(得分:1)

我不知道它是否仍然相关。

正如您所知,MySql中没有pivot这样的东西,但如果定义了列数,聚合可能看起来很容易:

SELECT
  SUM(IF(t2.code = 7, `7`, NULL)) as sum7,
  AVG(IF(t2.code=8, `8`, NULL)) as avg8
FROM t1 JOIN t2
  ON t1.id = t2.rel;