2014-11-11 2 views
0

я написал запрос, какMySQL запрос для отображения данных строки в одном столбце

SELECT 
SUBSTRING_INDEX(inter.CHR_SKILLLEVELS, ',', 1) AS level1, 
IF(@num_lines > 1, SUBSTRING_INDEX(SUBSTRING_INDEX(inter.CHR_SKILLLEVELS, ',', 2), ',', -1), '') AS level2, 
IF(@num_lines > 2, SUBSTRING_INDEX(SUBSTRING_INDEX(inter.CHR_SKILLLEVELS, ',', 3), ',', -1), '') AS level3, 
IF(@num_lines > 3, SUBSTRING_INDEX(SUBSTRING_INDEX(inter.CHR_SKILLLEVELS, ',', 4), ',', -1), '') AS level4, 
IF(@num_lines > 4, SUBSTRING_INDEX(SUBSTRING_INDEX(inter.CHR_SKILLLEVELS, ',', 5), ',', -1), '') AS level5 
FROM hrm_t_interview inter, 
(SELECT @num_lines := 1 + LENGTH(CHR_SKILLLEVELS) - LENGTH(REPLACE(CHR_SKILLLEVELS, ',', '')) FROM hrm_t_interview WHERE INT_APPLICANTID=15) temp 
WHERE inter.INT_APPLICANTID=15 

Я показал значение, как

level1 | level2  | level3 
====================================== 
    4  | 3   | 5 

Я хочу, чтобы отобразить значения, как

column1 | column2 
======================== 
    level1 |  4 
    level2 |  3 
    level3 |  5 

Пожалуйста, помогите мне используя mysql.

ответ

0

сырой способ будет использовать несколько unioned запросов, что-то вроде этого: -

SELECT 'level1' AS column1, SUBSTRING_INDEX(inter.CHR_SKILLLEVELS, ',', 1) AS column2 
FROM hrm_t_interview inter 
INNER JOIN 
(
    SELECT INT_APPLICANTID, 1 + LENGTH(CHR_SKILLLEVELS) - LENGTH(REPLACE(CHR_SKILLLEVELS, ',', '')) AS num_lines 
    FROM hrm_t_interview 
    GROUP BY INT_APPLICANTID 
    HAVING num_lines > 0 
) temp 
ON inter.INT_APPLICANTID = temp.INT_APPLICANTID 
WHERE inter.INT_APPLICANTID=15 
UNION 
SELECT 'level2' AS column1, SUBSTRING_INDEX(SUBSTRING_INDEX(inter.CHR_SKILLLEVELS, ',', 2), ',', -1) AS column2 
FROM hrm_t_interview inter 
INNER JOIN 
(
    SELECT INT_APPLICANTID, 1 + LENGTH(CHR_SKILLLEVELS) - LENGTH(REPLACE(CHR_SKILLLEVELS, ',', '')) AS num_lines 
    FROM hrm_t_interview 
    GROUP BY INT_APPLICANTID 
    HAVING num_lines > 1 
) temp 
ON inter.INT_APPLICANTID = temp.INT_APPLICANTID 
WHERE inter.INT_APPLICANTID=15 
UNION 
SELECT 'level3' AS column1, SUBSTRING_INDEX(SUBSTRING_INDEX(inter.CHR_SKILLLEVELS, ',', 3), ',', -1) AS column2 
FROM hrm_t_interview inter 
INNER JOIN 
(
    SELECT INT_APPLICANTID, 1 + LENGTH(CHR_SKILLLEVELS) - LENGTH(REPLACE(CHR_SKILLLEVELS, ',', '')) AS num_lines 
    FROM hrm_t_interview 
    GROUP BY INT_APPLICANTID 
    HAVING num_lines > 2 
) temp 
ON inter.INT_APPLICANTID = temp.INT_APPLICANTID 
WHERE inter.INT_APPLICANTID=15 
UNION 
SELECT 'level4' AS column1, SUBSTRING_INDEX(SUBSTRING_INDEX(inter.CHR_SKILLLEVELS, ',', 4), ',', -1) AS column2 
FROM hrm_t_interview inter 
INNER JOIN 
(
    SELECT INT_APPLICANTID, 1 + LENGTH(CHR_SKILLLEVELS) - LENGTH(REPLACE(CHR_SKILLLEVELS, ',', '')) AS num_lines 
    FROM hrm_t_interview 
    GROUP BY INT_APPLICANTID 
    HAVING num_lines > 3 
) temp 
ON inter.INT_APPLICANTID = temp.INT_APPLICANTID 
WHERE inter.INT_APPLICANTID=15 
UNION 
SELECT 'level5' AS column1, SUBSTRING_INDEX(SUBSTRING_INDEX(inter.CHR_SKILLLEVELS, ',', 5), ',', -1) AS column2 
FROM hrm_t_interview inter 
INNER JOIN 
(
    SELECT INT_APPLICANTID, 1 + LENGTH(CHR_SKILLLEVELS) - LENGTH(REPLACE(CHR_SKILLLEVELS, ',', '')) AS num_lines 
    FROM hrm_t_interview 
    GROUP BY INT_APPLICANTID 
    HAVING num_lines > 4 
) temp 
ON inter.INT_APPLICANTID = temp.INT_APPLICANTID 
WHERE inter.INT_APPLICANTID=15 

Немного более изящным может быть, чтобы создать диапазон строк, по одному для каждого возможного значения с разделителями.

Не тестировался, но что-то вроде этого: -

SELECT CONCAT('level', temp2.iCnt) AS column1, SUBSTRING_INDEX(SUBSTRING_INDEX(inter.CHR_SKILLLEVELS, ',', temp2.iCnt), ',', -1) AS column2 
FROM hrm_t_interview inter 
INNER JOIN 
(
    SELECT 1 + LENGTH(CHR_SKILLLEVELS) - LENGTH(REPLACE(CHR_SKILLLEVELS, ',', '')) AS num_lines 
    FROM hrm_t_interview 
    GROUP BY INT_APPLICANTID 
) temp 
ON inter.INT_APPLICANTID = temp.INT_APPLICANTID 
INNER JOIN 
(
    SELECT 0 AS iCnt UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 
) temp2 
ON temp.num_lines >= temp2.iCnt 
WHERE inter.INT_APPLICANTID=15 

Если вы можете расклеить некоторые тестовые данные, я буду проверять SQL.