kudjo
@kudjo

Как вывести результаты SQL запроса в несколько столбцов вместо отдельных строк?

Добрый день! Подскажите, пожалуйста.
Есть таблица примерно такого вида:
SELECT * FROM action_has_providers
action_ID	prov_title	track_no
10001		ProvA		#12345
10001		ProvB		AB123
10001		ProvC		R-0001
10002		ProvB		AC456
10002		ProvC		R-0002
10003		ProvA		#98765

Хочется видеть таблицу в таком виде:
action_ID	prov_title	track_no	prov_title	track_no	prov_title	track_no
10001		ProvA		#12345		ProvB		AB123		ProvC		R-0001
10002						ProvB		AC456		ProvC		R-0002
10003		ProvA	#98765

То есть, по каждому Action все track_no выводятся одной строкой (prov_title выводить необязательно, но мне показалось, так нагляднее). Количество prov фиксированное (3 штуки).

Как правильно составить запрос? Наверняка же частая задача. То ли я упускаю что-то очень простое и базовое, что все нормальные люди знают, то ли не могу спросить гугл нормально (везде вылезает GROUP_CONCAT, а это не то).

Спасибо!
  • Вопрос задан
  • 3433 просмотра
Решения вопроса 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Если prov_title для каждого action_ID одни и те же и их список фиксирован, то можно сделать LEFT JOIN'ами. Если нет - то только на клиенте.
SELECT  `t`.`action_ID`, `t1`.`prov_title` AS `prov_title_A`, `t1`.`track_no` AS `track_no_A`,
       `t2`.`prov_title` AS `prov_title_B`, `t2`.`track_no` AS `track_no_B`, 
       `t3`.`prov_title` AS `prov_title_C`, `t3`.`track_no` AS `track_no_C`
  FROM (
    SELECT DISTINCT `action_ID`
      FROM `action_has_providers`
  ) AS `t`
  LEFT JOIN `action_has_providers` AS `t1` 
    ON `t1`.`action_ID` = `t`.`action_ID` AND `t1`.`prov_title` = 'ProvA'
  LEFT JOIN `action_has_providers` AS `t2` 
    ON `t2`.`action_ID` = `t`.`action_ID` AND `t2`.`prov_title` = 'ProvB'
  LEFT JOIN `action_has_providers` AS `t3` 
    ON `t3`.`action_ID` = `t`.`action_ID` AND `t3`.`prov_title` = 'ProvC'
Ответ написан
Комментировать
longclaps
@longclaps
Вот таблица:
CREATE TABLE "T" (
	`action_ID`	INTEGER NOT NULL,
	`prov_title`	TEXT NOT NULL,
	`track_no`	TEXT NOT NULL
);
INSERT INTO `T` VALUES
 (10001,'ProvA','#12345'),
 (10001,'ProvB','AB123'),
 (10001,'ProvC','R-0001'),
 (10002,'ProvA','AC456'),
 (10002,'ProvB','R-0002'),
 (10002,'ProvC','#98765');

Вот запрос:
SELECT
  A.action_ID,
  A.track_no,
  B.track_no,
  C.track_no
FROM (SELECT * FROM T WHERE prov_title = "ProvA") AS A
JOIN (SELECT * FROM T WHERE prov_title = "ProvB") AS B
JOIN (SELECT * FROM T WHERE prov_title = "ProvC") AS C
ON A.action_ID = B.action_ID AND A.action_ID = C.action_ID;
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы