Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.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_Select_Stored Procedures_Hql - Fatal编程技术网

Mysql 将未知数量的数据显示为列名

Mysql 将未知数量的数据显示为列名,mysql,sql,select,stored-procedures,hql,Mysql,Sql,Select,Stored Procedures,Hql,在hql(或mysql)中,我想创建一个hql(或mysql)查询,它提供了所需的视图。我有三张桌子。我把它们叫做表A、表B、表C。 我有我想要的观点 Table A Aid RegNum BID Value 2CE7D0A7 2000000 D5981DFC 1 9D3C13AA 2000000 C58566C5 32 9DDB90C4 2000000 812E9E75 5343 表B通过表A中表B的外键连接到表A Ta

在hql(或mysql)中,我想创建一个hql(或mysql)查询,它提供了所需的视图。我有三张桌子。我把它们叫做表A、表B、表C。 我有我想要的观点

Table A
Aid         RegNum  BID         Value
2CE7D0A7    2000000 D5981DFC    1
9D3C13AA    2000000 C58566C5    32 
9DDB90C4    2000000 812E9E75    5343
表B通过表A中表B的外键连接到表A

Table B

BID             ColumnName              Index
D5981DFC        Question1               0
C58566C5        Question2               1
812E9E75        Question3               2
表C在表A中也有外键。Reg Num。Reg Num是表C中的主键

Table C 

Name        Surname     RegNum
Etibar      Hasanov     2000000
如您所见,表B中有一些列的名称是数据

DesiredView
Name        Surname     RegNum      Question1       Question2       Question3
Etibar      Hasanov     2000000     1               32              5343

在这个例子中,表A和表B中有3行,它不是静态的,我知道如果它是静态的,我可以使用case。然而,我正在寻找的查询中,列的数量取决于表B中的问题数量,如果有3个问题,那么desiredView中总共有6列,如果有4列,则有7列,依此类推

如果在MySQL中创建一个过程,那么就可以实现所需的动态行为

请创建一个过程并在过程中添加以下代码,它将提供动态输出

SELECT GROUP_CONCAT('SUM(IF(B.ColumnName = ''', ColumnName, ''', A.Value, 0)) AS ', ColumnName) INTO @str 
FROM TableB;

SET @s = CONCAT('select C.Name, C.Surname, C.RegNum, ', @str, 'from TableC C inner join TableA A on C.RegNum = A.RegNum inner join TableB B on A.BID = B.BID group by C.RegNum');
PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

如果在MySQL中创建一个过程,那么就可以实现所需的动态行为

请创建一个过程并在过程中添加以下代码,它将提供动态输出

SELECT GROUP_CONCAT('SUM(IF(B.ColumnName = ''', ColumnName, ''', A.Value, 0)) AS ', ColumnName) INTO @str 
FROM TableB;

SET @s = CONCAT('select C.Name, C.Surname, C.RegNum, ', @str, 'from TableC C inner join TableA A on C.RegNum = A.RegNum inner join TableB B on A.BID = B.BID group by C.RegNum');
PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;