2010-10-18 4 views
0

Допустим, у меня есть следующая таблица, называемая GPAs:Несколько строк, один запрос

name | semester | GPA 
Joe Winter  3.5 
Joe Spring  4.0 

Как я могу вернуть следующие в одном запросе?

name | gpaWinter | gpaSpring 

Joe  3.5   4.0 
+1

Прежде всего, вам необходимо нормализовать вашу базу данных. –

+1

@Col. Шрапнель: это ** нормализованная схема, позволяющая легко делать запросы, такие как * Что такое средний показатель GPA в семестрах? * – RedFilter

ответ

1
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 - получить данные; форматирование его для отображения - это работа кода приложения.

+0

Этот запрос не будет работать в общем случае, который он ищет. –

+1

@Pablo: Я не вижу ссылки на общий случай в вопросе OP. На самом деле, я вижу только детали очень конкретного случая. – RedFilter

+0

@RedFilter: согласен. Тем не менее, я думаю, он хочет общего решения. Я не остановил тебя или Дэн, кстати. :-) –

2
select name, 
    max(case when semester = 'Winter' then GPA end) as gpaWinter, 
    max(case when semester = 'Spring' then GPA end) as gpaSpring 
from GPAs 
group by name 
+0

Почему downvote? – RedFilter

+0

+1. Но есть дополнительная запятая после 'gpaSpring,' – a1ex07

+0

@ alex07: typo fixed – RedFilter

1
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 

Затем вы можете разобрать строку ГПА.

+1

В вопросе нет ссылки на PHP. – RedFilter

+0

Извините. Я удалил ссылку PHP. –

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