首页 > 解决方案 > MySQL 连接表和数据透视表(一更)

问题描述

我有以下 WordPress 表:

wp_f7h0p6_users

---------------------------------------
| ID | user_login | user_email        |
|  1 |  johnd     | johnd@example.com |
|  2 |  foob      | foob@example.com  |

wp_f7h0p6_usermeta

------------------------------------------------------
| umeta_id | user_id | meta_key          | meta_value |
|  1       |  1      | first_name        | John       |
|  2       |  1      | last_name         | Doe        |

我想得到这样的 SELECT 结果,为此我需要以wp_f7h0p6_usermeta某种方式转置表格。

-----------------------------------------------------------
| user_login | user_email        | first_name | last_name |
| johnd      | johnd@example.com | John       | Doe       |
| foob       | foob@example.com  | Foo        | Bar       |

我尝试过这样的事情。但它不会将结果分组到每个用户的一条记录中:

SELECT DISTINCT
    user_login,
    (CASE M.meta_key WHEN 'first_name' THEN M.meta_value END) first_name,
    (CASE M.meta_key WHEN 'last_name' THEN M.meta_value END) last_name,
    (CASE M.meta_key WHEN 'billing_first_name' THEN M.meta_value END) billing_first_name
    
FROM wp_f7h0p6_users U 
INNER JOIN wp_f7h0p6_usermeta M ON U.ID = M.user_id

结果如下所示:

-----------------------------------------------------------
| user_login | user_email        | first_name | last_name |
| johnd      | johnd@example.com |            |           |
| johnd      |                   | John       |           |
| johnd      |                   |            | Doe       |

如何正确分组?

标签: mysqlsqlpivot

解决方案


您可以尝试使用虚假聚合和分组依据

    SELECT DISTINCT
    user_login,
    max((CASE M.meta_key WHEN 'first_name' THEN M.meta_value END) ) first_name,
    max((CASE M.meta_key WHEN 'last_name' THEN M.meta_value END) )last_name,
    max((CASE M.meta_key WHEN 'billing_first_name' THEN M.meta_value END))  billing_first_name
    
    FROM wp_f7h0p6_users U 
    INNER JOIN wp_f7h0p6_usermeta M ON U.ID = M.user_id
    GROUP BY user_login

或使用别名对同一个表使用多个连接

SELECT 
user_login,
M1.meta_value first_name,
M2.meta_value last_name,
M3.meta_value  billing_first_name

FROM wp_f7h0p6_users U 
INNER JOIN wp_f7h0p6_usermeta M1 ON U.ID = M1.user_id and  M1.meta_key = 'first_name'
INNER JOIN wp_f7h0p6_usermeta M2 ON U.ID = M2.user_id and  M2.meta_key = 'last_name'
INNER JOIN wp_f7h0p6_usermeta M3 ON U.ID = M3.user_id  and  M3.meta_key = 'billing_first_name'   

推荐阅读