【问题标题】:mysql query to display row data in one columnmysql查询在一列中显示行数据
【发布时间】:2014-11-11 11:21:20
【问题描述】:

我写了这样的查询

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。

【问题讨论】:

    标签: mysql row datagridviewcolumn


    【解决方案1】:

    粗略的方法是使用多个联合查询,如下所示:-

    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。

    【讨论】:

      猜你喜欢
      • 2015-10-24
      • 1970-01-01
      • 1970-01-01
      • 2023-02-10
      • 1970-01-01
      • 2021-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多