Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 根据存储在另一个表中的列名选择列_Mysql_Sql - Fatal编程技术网

Mysql 根据存储在另一个表中的列名选择列

Mysql 根据存储在另一个表中的列名选择列,mysql,sql,Mysql,Sql,我试图从另一个表(UserTable)中获取单元格值,原始表(DataTable)中为该表指定了单元格的列。单元格值将用于计算一个分数,该分数将决定查询结果的顺序 UserTable: +--------+------+------+------+ | userid | c1 | c2 | c3 | +--------+------+------+------+ | id1 | 0 | 1 | 1 | | id2 | 0 | 0 | 1

我试图从另一个表(UserTable)中获取单元格值,原始表(DataTable)中为该表指定了单元格的列。单元格值将用于计算一个分数,该分数将决定查询结果的顺序

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 = ?;