水平显示MySQL记录

时间:2014-10-12 18:47:06

标签: php mysql

通常我们从MySQL表中获取数据并逐行显示已获取的记录。但有时我们需要水平显示记录,如下所示。

Name * Student-ID * subject-1 * subject-2 * subject-3 * subject-4 * subject-5 ... So On
John      1            20           50          34          50         45 
Mercy     3            40           20          82          23         10
James     8            30           60          40          50         30
Agi       19           50           10          23          45         30

现在正在寻找能够产生上述结果的方法。下面是MySQL表格,我想提出上述预期结果。

科目按类分类存储科目

  1. subjectid
  2. 主旨名称
  3. examinationid
  4. 表testinfo存储检查信息如下

    1. assessment_id
    2. idsubject
    3. 考试将学生分数与相关信息一起存储

      1. studentid
      2. FNAME
      3. L-NAME
      4. id_subject
      5. 得分

        • examinationid == assessment_id
        • id_subject AND idsubject == subjectid
      6. 查询所有参加考试的学生(1)

        SELECT *
        FROM examinations AS exam
        INNER JOIN examinfo AS info ON info.idsubject = exam.id_subject
        WHERE info.assessment_id = 1
        

        以上查询将生成结果垂直,以便如何水平转换或查询表格。我错过了它因为我之前从未以这种方式使用过SQL。谢谢你的手

2 个答案:

答案 0 :(得分:1)

您正在寻找MYSQL枢轴

STATIC WAY : 使用条件案例与分组

SELECT CONCAT(exam.fname," ",exam.lname) AS Name, exam.studentid, 
 SUM(CASE WHEN exam.id_subject = 1 THEN exam.score ELSE "NA" END) AS subject1,
 SUM(CASE WHEN exam.id_subject = 2 THEN exam.score ELSE "NA" END) AS subject2,  
 SUM(CASE WHEN exam.id_subject = 3 THEN exam.score ELSE "NA" END) AS subject3,
 SUM(CASE WHEN exam.id_subject = 4 THEN exam.score ELSE "NA" END) AS subject4,  
 SUM(CASE WHEN exam.id_subject = 5 THEN exam.score ELSE "NA" END) AS subject5
FROM examinations AS exam
INNER JOIN examinfo AS info ON info.idsubject = exam.id_subject
WHERE info.assessment_id = 1
GROUP BY exam.studentid

动态方式GROUP_CONCAT使用CONCAT

SET @sql = NULL;
SELECT
    GROUP_CONCAT(DISTINCT 
    CONCAT('SUM(CASE WHEN id_subject= "', 
    id_subject, '" THEN score ELSE "NA" END) AS '
    , 'Subject-', id_subject))
INTO @sql
FROM
  examinations;

SET @sql = CONCAT('SELECT CONCAT(fname," ",lname) AS Name, 
                   studentid, ', @sql, ' 
                  FROM examinations
                  INNER JOIN examinfo AS info ON info.idsubject = id_subject
                  WHERE info.assessment_id = 1
                  GROUP BY studentid');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

答案 1 :(得分:0)

使用以下查询

SELECT CONCAT(exam.fname," ",exam.lname) AS Name, exam.studentid, 
 (CASE WHEN exam.subjectid = 1 THEN exam.score END ),
 (CASE WHEN exam.subjectid = 2 THEN exam.score END ),  
 (CASE WHEN exam.subjectid = 3 THEN exam.score END ),
 (CASE WHEN exam.subjectid = 4 THEN exam.score END ),  
 (CASE WHEN exam.subjectid = 5 THEN exam.score END ),
FROM examinations AS exam
INNER JOIN examinfo AS info ON info.idsubject = exam.id_subject
WHERE info.assessment_id = 1
GROUP BY exam.studentid