2014-10-12 2 views
0

Обычно мы извлекаем данные из таблицы 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. SubjectName
  3. examinationid

Таблица examinfo хранит информацию экспертизы следует

  1. assessment_id
  2. idsubject

Таблица экзамены Stores Студенческие результаты наряду с соответствующей информацией следует

  1. studentid
  2. Fname
  3. LNAME
  4. id_subject
  5. оценка

    • examinationid == assessment_id
    • id_subject И idsubject == subjectid

для запроса всех студентов класса, которые сидели на экспертизу с идентификатором examinationid (1)

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

Вышеуказанный запрос даст результаты по вертикали так Как преобразовать или запросить таблицу по горизонтали. Я пропустил его, потому что раньше я никогда не использовал SQL.Спасибо за вашу руку

+2

Вы отметили это с помощью PHP. Как правило, лучше всего обрабатывать проблемы отображения данных на уровне уровня приложения/презентации (например, простой цикл PHP). – Strawberry

ответ

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 

DYNAMIC WAY: Использование 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; 
+0

@firstmadcoding: Пожалуйста, проверьте и ответьте? –

+0

У Rockse есть ошибка: # 1064 - У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом '), (CASE WHEN exam.subjectid = 2 THEN exam.score ELSE "NA"), (CASE WHEN exam' по строке 2 Другое дело мои субъекты ограничены – firstmadcoding

+0

@firstmadcoding: теперь его хорошо, забыли использовать END, пожалуйста, проверьте –

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

не мой, но, по крайней мере, удалите запятую из последней END, она покажет ошибку. Вы скопировали немного неправильного из моего запроса: P –

+0

На моем сервере работает без запятой, что не должно быть проблемой, лучше это работает, но проблема в том, что запрос ограничен 5 темами, есть ли способ его ограничить? как и присоединение к теме таблицы, где examid = 1 – firstmadcoding

Смежные вопросы