我知道必须有办法做到这一点,但对于我的生活,我无法理解:
我有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的行作为我的列
编辑:我也试过谷歌搜索,但我似乎无法弄清楚如何用谷歌来表达这一点。答案 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值的查询。
或者您可以在其他程序/代码中进行简单的多对多连接和分析数据。