MYSQL,动态行到列

时间:2017-05-01 15:26:56

标签: mysql pivot-table

我有一个看起来像这样的表用户(涉及更多列)

        'rules'=>array(
            '<controller:\w+>/<id:\d+>'=>'<controller>/view',
            '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',
            '<controller:\w+>/<action:\w+>'=>'<controller>/<action>',
        ),

表格产品看起来像这样

user_id | user_name |
1       |   adam    |
2       |   berta   |
3       |   caesar  |

和表u_p,指的是允许用户使用的产品

product_id | product_name |
1          |   product 1  |
2          |   product 2  |
3          |   product 3  |
4          |   product 4  |

其中u_p_user和u_p_prod是user_id resp的外键。 PRODUCT_ID。

我想要的是:

u_p_id  | u_p_user  | u_p_prod  |
1       |   1       |   1       |
2       |   1       |   2       |
3       |   2       |   3       |

用户和产品必须是动态的,当然。

如何在mySQL中完成?

1 个答案:

答案 0 :(得分:2)

这通常被称为枢轴。如果不对每个不同的值硬编码一列,就无法进行透视。这意味着您需要在编写SQL查询之前知道之前的一组不同值。

SELECT u.user_id, u.user_name,
  COALESCE(MAX(IF(u_p.prod=1, 1, 0), 0) AS `u_p_prod=1`,
  COALESCE(MAX(IF(u_p.prod=2, 1, 0), 0) AS `u_p_prod=2`,
  COALESCE(MAX(IF(u_p.prod=3, 1, 0), 0) AS `u_p_prod=3`,
  COALESCE(MAX(IF(u_p.prod=4, 1, 0), 0) AS `u_p_prod=4`
FROM user AS u
LEFT OUTER JOIN u_p ON u.user_id = u_p.u_p_user
GROUP BY u.user_id;