MySQL将多对多连接作为单行加入

时间:2010-01-06 15:49:54

标签: sql mysql join pivot

我知道必须有办法做到这一点,但对于我的生活,我无法理解:

我有3个表,我想加入(简化说明):

users
uid mail
1   qq@qq.com
2   ww@ww.com
3   ee@ee.com

profile_fields
fid name        label
1   full_name   Full Name
2   phone       Phone

profile_values
uid fid value
1   1   Q Q
1   2   5555555555
2   1   Ww Ww
3   2   4444525411

我想获得表格的结果:

uid mail        full_name   phone
1   qq@qq.com   Q Q     5555555555
2   ww@ww.com   Ww Ww       NULL
3   ee@ee.com   NULL        44445454111

我尝试了各种具有不同JOIN条件的SELECT,但我似乎无法弄清楚如何在我的SELECT中将profile_fields的行作为我的列

编辑:我也试过谷歌搜索,但我似乎无法弄清楚如何用谷歌来表达这一点。

3 个答案:

答案 0 :(得分:4)

使用:

SELECT u.uid,
       u.mail,
       MAX(CASE WHEN pf.name = 'full_name' THEN pv.value END) AS full_name,
       MAX(CASE WHEN pf.name = 'phone' THEN pv.value END) AS phone
  FROM USERS u
  LEFT JOIN PROFILE_VALUES pv ON pv.uid = u.uid
  JOIN PROFILE_FIELDS pf ON pf.fid = pv.fid
                        AND pf.name IN ('full_name', 'phone')
GROUP BY u.uid, u.mail

答案 1 :(得分:1)

您要做的事情称为枢轴。 MySQL本身不支持透视,但您可以使用发布的OMG Ponies查询来完成。

但是,如果必须支持任意数量的配置文件字段,则必须动态构建SQL。

答案 2 :(得分:0)

我认为一般来说你不能做你想做的事。即使@OMG Ponies示例是正确的,它也不适用于profile_field名称的其他值。

您可以尝试编写一些代码,根据实际的profile_fields生成不同profile_fields值的查询。

或者您可以在其他程序/代码中进行简单的多对多连接和分析数据。