2017-05-14 1 views
0

Ich habe eine Umfrage angeordnet, wo ein Projekt einige Fragen hat. Benutzer müssen die gegebene Projektantwort von der Öffentlichkeit sammeln. Umfrage Tabellen wieMysql wählen dynamische Zeilenwerte als Spaltenname aus einer Tabelle und Wert aus einer anderen Tabelle

Benutzertabellen

user_id  user_name 
    1   User 1 
    2   User 2 

Projekttisch

project_id project_name 
    1   project 1  
    2   project 2 

Frage Tisch

ques_id project_id ques_name 
    1   1   Question 1 
    2   1   Question 2 
    3   1   Question 3 
    4   1   Question 4 

Antwort Tabelle

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 

Jetzt möchte ich eine Berichte generieren, wo Frage Tabellenwerte als Spaltennamen gegeben project_id angepasst und die Frage beantwortet, da Wert von Antworttabelle angepasst durch ques_id

Und sie ist meine erwartete Ausgabe:

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

Jemand hat vorgeschlagen, Pivot zu verwenden, aber ich fand "MySQL hat keine native Unterstützung für Pivoting-Operationen" kann mir jemand helfen?

+1

Mögliches Duplikat von: http://stackoverflow.com/questions/12598120/mysql-pivot-table-query-with-dynamic-columns –

+0

Unter der Annahme, dass jeder Benutzer jede Frage nur einmal beantworten kann, dient antwort_id keinem Zweck – Strawberry

+0

Abgesehen davon, ignorieren Sie das vorgeschlagene Duplikat und stattdessen in Betracht ziehen, Probleme der Datenanzeige in Anwendungscode – Strawberry

Antwort

0

Schließlich ist der Code arbeiten

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; 
1

Sie können ein anderes Ausgabeformat der Abfrage verwenden. Zum Beispiel:

SELECT user_name, answer.project_id, ques_name, ques_ans 
FROM 
    `answer` 
    INNER JOIN `user` USING (user_id) 
    INNER JOIN `question` USING (ques_id); 

beschränken Reihen von bestimmten Projekt WHERE Klausel hinzufügen:

WHERE project_id = @ProjectID 

Dann das Ergebnis in die gewünschte Ansicht Transformation mit PHP.
Wenn es entscheidend ist, die Frage mit MySQL zu lösen, dann erstellen Sie manuell neue Spalten mithilfe von Aliasen. Um Zeilen nach Benutzer und Projekt zu aggregieren, verwenden Sie GROUP BY Klausel. Um die möglichen nicht leeren Werte anzuzeigen, verwenden Sie die Funktion MAX(). In Ihrem Fall:

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; 
+0

@RiyadhAhmed, meine Antwort ist ein "Plan B". – Alexander

+0

Plan B? tatsächlich versuche ich immer noch, das Ergebnis zu transformieren, indem ich dem [link] (http://stackoverflow.com/questions/12598120/mysql-pivot-table-query-with-dynamic-columns) folge, aber nicht arbeiten kann ... –

+0

@ Riyadh Ahmed, du hast Recht.Wenn es entscheidend ist, die Frage mit MySQL zu lösen, könnten Sie versuchen, [existing solution] (http://stackoverflow.com/questions/12598120/mysql-pivot-table-query-with-dynamic-columns) für Ihren Fall anzupassen . Ansonsten verwenden Sie "Plan B". – Alexander

0

sollte Ihre Frage sein:

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 

Für die Tischdrehung: hier eine ähnliche Frage über Drehtische

mysql pivot table date (vertical to horizontal data)

Verwandte Themen