Задать вопрос

Изменение структуры/группировка SELECT`ом

Есть в MySQL таблица:
name phone phonetype
Иван 01 home
Иван 02 mobile
Владимир 03 home

Нужно сделать выборку, которая вернёт такое:
name home mobile
Иван 01 02
Владимир 03 NULL (или пустое значение)

То есть каждому уникальному значению phonetype ставится в соответствие новый столбец в результирующей таблице, значение которого берём из phone.
Интуитивно понимаю, что надо как-то смотреть в сторону GROUP BY и джойнов, но как именно это сделать, понять не могу. Просьба помочь советом, как это можно реализовать
  • Вопрос задан
  • 2678 просмотров
Подписаться 4 Оценить 2 комментария
Пригласить эксперта
Ответы на вопрос 4
@ztxn
select name
   ,max(case when phone_type = 'home' then phone end) as home
   ,max(case when phone_type = 'mobile' then phone end) as mobile
from table
group by name
Ответ написан
@konsoletyper
Ещё можно и так:

SELECT
    home.name AS name,
    home.phone AS home,
    mobile.phone AS mobile
FROM tablename home
OUTER JOIN tablename mobile ON home.name = mobile.name
WHERE home.phonetype = 'home'
AND mobile.phonetype = 'mobile'
Ответ написан
@vvnick
Я бы еще посоветовал поле phonetype сделать типа set, и перечислить там четко все значения — тогда оно будет быстрее работать. И запрос перестраивать тогда одновременно с альтером таблицы надо будет — меньше шансов случайно что-то забыть.
Ответ написан
Комментировать
Ну это просто через джоин и груп бай не сделать. ;-)
Tакие вещи делаются примерно вот так:

rows = db_cursor.query(«SELECT * FROM… ORDER BY name.»);

# структура одного рядка
#row_entry = {
# 'name': None
# 'home': None
# 'mobile': None
#}

проходим все рядки из rows. Держим изменение «name». Как только изменится = новый элемент. Для каждого нового элемента делаем структуру row_entry.

Далее такое можно сделать с помощю курсоров и процедурок в PL/SQL.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы