[英]select table and replace column fields by value from another table in 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
對於旋轉表 :這里有一個關於旋轉表的類似問題
最終代碼起作用了
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.