MySQL select column name as field

19,711

Solution 1

This is called a pivot. Actually it's a reverse pivot. See here for some background. http://www.artfulsoftware.com/infotree/queries.php#78

MySQL does it the hard way. It's a pain in the neck. Many people who do lots of this kind of work in MySQL use programs to generate these queries.

SELECT `column`, column_value 
  FROM (
    SELECT id, 'col_1' as `column`, col_1 as column_value FROM tab
     UNION
    SELECT id, 'col_2' as `column`, col_2 as column_value FROM tab
     UNION
    SELECT id, 'col_3' as `column`, col_3 as column_value FROM tab
  ) pivot
  WHERE id=1

Solution 2

You could do it like this, this will return to you 2 comma separated first one of columns second of values, which you can explode and merge into KEY/VALUE arrays in PHP.

SELECT 
    GROUP_CONCAT(COLUMN_NAME) AS _columns,
    (SELECT 
            GROUP_CONCAT(columnName, ',', columnName)
        FROM table_name
        WHERE id = 1)
FROM
    information_schema.columns
WHERE
    table_name = 'table_name'
        AND COLUMN_NAME IN ('columnName' , 'columnName');       
Share:
19,711

Related videos on Youtube

Thomas Clayson
Author by

Thomas Clayson

Updated on October 21, 2022

Comments

  • Thomas Clayson
    Thomas Clayson over 1 year

    I have a mysql table that looks something like this:

    id | col_1 | col_2 | col_3
    ---|-------|-------|------
    1  | 2     | 34    | 64
    2  | 6     | 53    | 23
    

    I would like to be able to query on the id and get multiple rows, one for each column. E.g:

    SELECT column_name as column, column_value as value FROM my_table WHERE id=1;
    

    Which would give me:

    column | value
    -------|-------
    col_1  | 2
    col_2  | 34
    col_3  | 64
    

    What would I need to use to formulate a query like this?

    Many thanks

  • Thomas Clayson
    Thomas Clayson almost 12 years
    Ah, thats useful and probably the best way to do it. :) Thanks for that
  • Kao
    Kao almost 12 years
    Just updated as you accepted it, I can take it back to the old revision if you liked it better. :)
  • Thomas Clayson
    Thomas Clayson almost 12 years
    I wouldn't worry. Ollie's is more straightforward, but this one is more technical, so may be useful to other people who come here. :)