簡體   English   中英

MySQL從表中選擇動態行值作為列名,從另一個表中選擇值

[英]Mysql select dynamic row values as column name from a table and value from another table

我安排了一個項目有一些問題的調查。 用戶必須從公眾那里收集給定的項目答案。 調查表如

用戶表

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 

現在我想生成一個報告,其中問題表值作為與給定project_id匹配的列名,問題回答作為值與ques_id匹配的答案表中的值

而且,她是我的預期輸出:

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

有人建議使用數據透視,但是我發現“ 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解決問題至關重要,請使用別名手動創建新的列。 要按用戶和項目聚合行,請使用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

對於旋轉表 :這里有一個關於旋轉表的類似問題

mysql數據透視表日期(垂直到水平數據)

最終代碼起作用了

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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM