Php 如何将表1中的所有记录和表2中的元数据放在一起?

Php 如何将表1中的所有记录和表2中的元数据放在一起?,php,mysql,sql,ajax,Php,Mysql,Sql,Ajax,我想知道是否有其他方法可以获取表1用户的所有记录和表2用户的所有元数据,我现在使用的方法是: 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

我想知道是否有其他方法可以获取表1用户的所有记录和表2用户的所有元数据,我现在使用的方法是:

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,但这一个将有如此多的元数据,这将是一个需要维护的巨大查询


谢谢。

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

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方法更快,因为键的数量越来越多。但是,如果要向下筛选到一个或几个用户,则需要在聚合之前进行筛选,以获得良好的性能。

感谢您提醒我们使用实体属性值EAV model的乐趣。子查询中没有ORDER BY的LIMIT 1是不符合逻辑的,因为MySQL可以按任意顺序返回记录。