我有这个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
非常感谢!
答案 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;