如何将表1中的所有记录和tabla 2中的元数据一起获取?

时间:2018-04-11 15:38:01

标签: php mysql sql ajax

我想知道是否有任何其他方式来获取表1(用户)中的所有记录以及表2(user_meta)上的所有元数据,我现在正在使用这种方式:

SELECT 
u.id, 
u.username, 
u.email, 
r.role,
(SELECT val FROM user_meta WHERE id_parent = u.id AND attr = 'sidebar_color' LIMIT 1) AS sidebar_color,
(SELECT val FROM user_meta WHERE id_parent = u.id AND attr = 'profile_pic' LIMIT 1) AS profile_pic,
(SELECT val FROM user_meta WHERE id_parent = u.id AND attr = 'thumbnail' LIMIT 1) AS thumbnail,
(SELECT val FROM user_meta WHERE id_parent = u.id AND attr = 'bg_img' LIMIT 1) AS bg_img,
(SELECT val FROM user_meta WHERE id_parent = u.id AND attr = 'bio' LIMIT 1) AS bio,
(SELECT val FROM user_meta WHERE id_parent = u.id AND attr = 'google' LIMIT 1) AS google,
(SELECT val FROM user_meta WHERE id_parent = u.id AND attr = 'facebook' LIMIT 1) AS facebook,
(SELECT val FROM user_meta WHERE id_parent = u.id AND attr = 'twitter' LIMIT 1) AS twitter,
(SELECT val FROM user_meta WHERE id_parent = u.id AND attr = 'whatsapp' LIMIT 1) AS whatsapp
FROM users u 
LEFT JOIN roles r ON u.id_role = r.id
ORDER BY u.id
ASC

而且它正在运行,我从所有用户那里得到所有数据,但我想要另一种方式,因为我将使用相同的方法进行CRM,但这个将拥有如此多的元数据并且它将是一个巨大的查询维护。

谢谢。

1 个答案:

答案 0 :(得分:1)

你的方法很好,在很多情况下是最快的。但聚合也是可行的:

SELECT um.id_parent,
       MAX(CASE WHEN um.attr = 'sidebar_color' THEN val END) as sidebar_color,
       MAX(CASE WHEN um.attr = 'profile_pic' THEN val END) as profile_pic,
       . . .
FROM user_meta um
GROUP BY um.id_parent;

这通常是FROM子句中的子查询。

要获取所有用户的信息,这可能比JOIN方法更快,因为密钥数量变大。但是,如果您要过滤给一个或少数几个用户,您希望在聚合之前进行过滤以获得良好的性能。