Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.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,我已经安排了一个调查,其中一个项目有一些问题。用户必须从公众那里收集给定的项目答案。调查表格如 用户表 user_id user_name 1 User 1 2 User 2 项目表 project_id project_name 1 project 1 2 project 2 问题表 ques_id project_id ques_name 1 1

我已经安排了一个调查,其中一个项目有一些问题。用户必须从公众那里收集给定的项目答案。调查表格如

用户表

user_id     user_name
  1          User 1   
  2          User 2
项目表

project_id  project_name
  1           project 1    
  2           project 2
问题表

ques_id  project_id  ques_name
  1         1         Question 1
  2         1         Question 2 
  3         1         Question 3
  4         1         Question 4 
答题台

ans_id  public_id  user_id ques_id  ques_ans
  1         1      1         1     Answer 1
  2         1      1         2     Answer 2 
  3         1      1         3     Answer 3
  4         1      1         4     Answer 4 
现在我想生成一个报告,其中问题表的值作为列名与给定的项目id匹配,问题答案作为答案表的值与问题id匹配

她是我的期望输出:

User_Name  public_id  Question 1  Question 2  Question 3  ...
User 1        1         Answer 1   Answer 2    Answer 3   ...

有人建议使用pivot,但我发现“MySQL不支持原生数据透视操作”,有人能帮我吗?

您可以使用另一种查询输出格式。例如:

SELECT user_name, answer.project_id, ques_name, ques_ans
FROM 
    `answer` 
    INNER JOIN `user` USING (user_id)
    INNER JOIN `question` USING (ques_id);
要按特定项目限制行,请添加
WHERE
子句:

 WHERE project_id = @ProjectID
然后使用PHP将结果转换为所需的视图
如果使用MySQL解决问题很关键,那么使用aliaces手动创建新列。要按用户和项目聚合行,请使用
GROUP by
子句。要显示可能的非空值,请使用
MAX()
函数。就你而言:

SELECT
  user_name, project_id,
  MAX(IF(ques_name = 'Question 1', ques_ans, NULL)) AS `Question 1`,
  MAX(IF(ques_name = 'Question 2', ques_ans, NULL)) AS `Question 2`,
  MAX(IF(ques_name = 'Question 3', ques_ans, NULL)) AS `Question 3`,
  MAX(IF(ques_name = 'Question 4', ques_ans, NULL)) AS `Question 4`
FROM
    (SELECT 
        ans_id, user_id, user_name, answer.project_id, ques_name, ques_ans
    FROM 
        answer
        INNER JOIN `user` USING (user_id)
        INNER JOIN question USING (ques_id)
        ) AS tmp
GROUP BY
  user_id, project_id;
您的查询应该是:

SELECT an.user_name,an.public_id,qs.quest_name,an.quest_answer 
FROM answer_table an,question_table qs,user_table usr
WHERE an.quest_id = qs.quest_id
AND an.user_id=usr.user_id
关于桌子旋转:这里有一个关于旋转桌子的类似问题


代码终于开始工作了

SET @sql = NULL;
    SELECT
    GROUP_CONCAT(DISTINCT
    CONCAT(
    'MAX(IF(a.ques_id = ',
    ques_id,
    ', a.ques_ans, NULL)) AS `',
    ques_name,'`'
    )
    ) INTO @sql
     FROM survey_answer inner join survey_question on  survey_answer.ques_id=survey_question.id;

set @sql = CONCAT('select u.user_name ,q.category_id,a.p_code, ' ,@sql,'  FROM `survey_answer` as a
LEFT JOIN `users` as u ON a.user_id = u.user_id
LEFT JOIN `survey_question` as q ON a.ques_id= q.id');
 PREPARE stmt FROM @sql;
 EXECUTE stmt;
 DEALLOCATE PREPARE stmt;

可能的副本:假设每个用户只能回答每一个问题,应答器就没有目的,除了忽略建议的副本,而是考虑在应用中处理数据显示的问题。code@RiyadhAhmed,我的答案是“B计划”。B计划?事实上,我仍在试图通过以下方式改变结果,但无法奏效…@Riyadh Ahmed,你是对的。如果使用MySQL解决这个问题很关键,那么您可以尝试适应您的情况。否则,请使用“B计划”。@Alexander我尝试了现有的解决方案,但失败了。你能帮助我如何转换结果或使用现有的解决方案来解决问题吗?@Riyadh Ahmed,你很固执:)请参阅我答案的新版本。