Допустим, у меня есть следующая таблица, называемая GPAs
:Несколько строк, один запрос
name | semester | GPA
Joe Winter 3.5
Joe Spring 4.0
Как я могу вернуть следующие в одном запросе?
name | gpaWinter | gpaSpring
Joe 3.5 4.0
Допустим, у меня есть следующая таблица, называемая GPAs
:Несколько строк, один запрос
name | semester | GPA
Joe Winter 3.5
Joe Spring 4.0
Как я могу вернуть следующие в одном запросе?
name | gpaWinter | gpaSpring
Joe 3.5 4.0
SELECT name, (SELECT GPA FROM GPAs WHERE name = t1.name AND semester = 'Winter') AS `gpaWinter`, (SELECT GPA FROM GPAs WHERE name = t1.name AND semester = 'Spring') AS `gpaSpring` FROM GPAs t1
Но вы не должны действительно делать это в SQL. Цель SQL - получить данные; форматирование его для отображения - это работа кода приложения.
Этот запрос не будет работать в общем случае, который он ищет. –
@Pablo: Я не вижу ссылки на общий случай в вопросе OP. На самом деле, я вижу только детали очень конкретного случая. – RedFilter
@RedFilter: согласен. Тем не менее, я думаю, он хочет общего решения. Я не остановил тебя или Дэн, кстати. :-) –
SELECT name,GROUP_CONCAT(semester) AS semesters,GROUP_CONCAT(GPA) AS GPAs
FROM GPAs
GROUP BY name
Это возвращает строку типа:
name | semesters | GPAs
Joe Winter,Spring 3.5,4.0
Затем вы можете разобрать семестров и GPAs.
Вы также можете сделать что-то вроде GROUP_CONCAT(semester,'=',GPA) as GPAs
, который будет возвращать:
name | GPAs
Joe Winter=3.5,Spring=4.0
Затем вы можете разобрать строку ГПА.
В вопросе нет ссылки на PHP. – RedFilter
Извините. Я удалил ссылку PHP. –
Прежде всего, вам необходимо нормализовать вашу базу данных. –
@Col. Шрапнель: это ** нормализованная схема, позволяющая легко делать запросы, такие как * Что такое средний показатель GPA в семестрах? * – RedFilter