Mysql 根据存储在另一个表中的列名选择列
我试图从另一个表(UserTable)中获取单元格值,原始表(DataTable)中为该表指定了单元格的列。单元格值将用于计算一个分数,该分数将决定查询结果的顺序Mysql 根据存储在另一个表中的列名选择列,mysql,sql,Mysql,Sql,我试图从另一个表(UserTable)中获取单元格值,原始表(DataTable)中为该表指定了单元格的列。单元格值将用于计算一个分数,该分数将决定查询结果的顺序 UserTable: +--------+------+------+------+ | userid | c1 | c2 | c3 | +--------+------+------+------+ | id1 | 0 | 1 | 1 | | id2 | 0 | 0 | 1
UserTable:
+--------+------+------+------+
| userid | c1 | c2 | c3 |
+--------+------+------+------+
| id1 | 0 | 1 | 1 |
| id2 | 0 | 0 | 1 |
| id3 | 1 | 0 | 0 |
| id4 | 1 | 1 | 0 |
+--------+------+------+------+
DataTable:
+--------+------+------+------+
| id | ColA | ColB | ColC |
+--------+------+------+------+
| 1 | A | B | c1 |
| 2 | D | E | c3 |
| 3 | G | H | c2 |
| 4 | J | K | c3 |
+--------+------+------+------+
我当前未工作的查询是:
SELECT *,
(SELECT DataTable.ColC
FROM UserTable
WHERE UserTable.userid = 'some_user_id') AS score
FROM DataTable
ORDER BY score DESC
但这不会在UserTable中选择适当的列,而是返回ColC中包含的字符串值
预期产出:
例如,如果'some_user_id'设置为'id2'。预期产出将是:
+--------+------+------+------+------+
| id | ColA | ColB | ColC | score|
+--------+------+------+------+------+
| 2 | D | E | c3 | 1 |
| 4 | J | K | c3 | 1 |
| 1 | A | B | c1 | 0 |
| 3 | G | H | c2 | 0 |
+--------+------+------+------+------+
其中score列只是从UserTable中查找值
有可能解决此问题吗?您不能动态地执行此操作。但您可以构建将列名映射到列的CASE语句:
SELECT DataTable.*, (
SELECT CASE DataTable.ColC
WHEN 'c1' THEN UserTable.c1
WHEN 'c2' THEN UserTable.c3
WHEN 'c3' THEN UserTable.c3
END
FROM UserTable
WHERE UserTable.userid = 'id2'
) AS score
FROM DataTable
ORDER BY score DESC
我想通过取消激活用户表来表达这一点:
select dt.*, uts.score
from datatable dt left join
((select ut.userid, 'c1' as which, c1 as score
from usertable ut
) union all
(select ut.userid, 'c2' as which, c2 as score
from usertable ut
) union all
(select ut.userid, 'c3' as which, c3 as score
from usertable ut
)
) uts
on dt.colc = uts.which
where uts.userid = ?;
我之所以喜欢这种方法,是因为子查询建议了您真正需要的表。您不应该在列中存储不同的分数值。您应该有一个
userScores
表,每个用户和每个分数有一行。我现在刚刚更新了它。非常感谢您的解决方案,我非常感谢!虽然这有点烦人,但由于我的专栏随着时间的推移而发生变化,所以无法动态完成。谢谢您的回复。您是否测试过此代码/您使用的mysql版本是什么?在5.6上,语法不签出。例如,前两个Declare语句是否应该改为SET语句?您提出了一个很好的观点。我想我将为每个userid创建一个表,每个列(c1、c2、c3)都有一行以及相应的分数。对于我的应用程序,有数千个名为c1..cN的列
select dt.*, uts.score
from datatable dt left join
((select ut.userid, 'c1' as which, c1 as score
from usertable ut
) union all
(select ut.userid, 'c2' as which, c2 as score
from usertable ut
) union all
(select ut.userid, 'c3' as which, c3 as score
from usertable ut
)
) uts
on dt.colc = uts.which
where uts.userid = ?;