Как преобразовать набор из 4 строк в столбцы в MySQL?

72
6

У меня вопрос MySQL, и у меня нет идеи, как его решить.

У меня есть следующий запрос:

SELECT p.nombre, ti.tallerhorario_id FROM persona p, talleresinscritos ti WHERE p.pasaporte = ti.pasaporte

В результате получается следующее:

enter image description here

Я ищу запрос, в котором второй столбец не отображается как строка для каждого "tallerhorario_id", но для каждого "nombre".

Например:

EUCLIDES | 7 | 24 | 32 | 48

ЛИЗ ЛОРЕНА | 4 | 18 | 33 | 47

У каждого человека всегда есть 4 строки, без исключений.

Не могли бы вы мне помочь, пожалуйста?

Спасибо!

спросил(а) 2015-06-19T03:42:00+03:00 5 лет, 5 месяцев назад
1
Решение
72

Самый простой способ - фактически поместить значения в один столбец, используя group_concat():

SELECT p.nombre, group_concat(ti.tallerhorario_id)
FROM persona p JOIN -- LEARN TO USE PROPER EXPLICIT JOIN SYNTAX
talleresinscritos ti
ON p.pasaporte = ti.pasaporte
GROUP BY p.nombre;

Список с разделителями-запятыми - это не то, о чем вы просили, но это может решить вашу проблему. Если у вас есть счетчик, скажем 1, 2, 3 и 4, вторая таблица, то вы можете легко сделать это, используя условную агрегацию:

SELECT p.nombre, 
MAX(case when counter = 1 then ti.tallerhorario_id end) as id1,
MAX(case when counter = 2 then ti.tallerhorario_id end) as id2,
MAX(case when counter = 3 then ti.tallerhorario_id end) as id3,
MAX(case when counter = 4 then ti.tallerhorario_id end) as id4
FROM persona p JOIN -- LEARN TO USE PROPER EXPLICIT JOIN SYNTAX
talleresinscritos ti
ON p.pasaporte = ti.pasaporte
GROUP BY p.nombre;

Наконец, если у вас нет счетчика, одним из способов является добавление одного из них:

SELECT p.nombre, 
MAX(case when counter = 1 then ti.tallerhorario_id end) as id1,
MAX(case when counter = 2 then ti.tallerhorario_id end) as id2,
MAX(case when counter = 3 then ti.tallerhorario_id end) as id3,
MAX(case when counter = 4 then ti.tallerhorario_id end) as id4
FROM persona p JOIN -- LEARN TO USE PROPER EXPLICIT JOIN SYNTAX
(SELECT ti.*,
(@rn := if(@p = pasaporte, @rn + 1
if(@p := pasaporte, 1, 1)
)
) as counter
FROM talleresinscritos ti CROSS JOIN
(SELECT @p := '', @rn := 0) params
ORDER BY ti.pasaporte
) ti
ON p.pasaporte = ti.pasaporte
GROUP BY p.nombre;

ответил(а) 2015-06-19T03:48:00+03:00 5 лет, 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема