我正在尝试创建一个查询来从主表(WordPress 用户表)和用户元表中获取信息。
如果您不熟悉 WP 数据库架构:wp_users 保存基本用户信息及其 ID,wp_usermeta 保存 ID、meta_key 和 meta_value。
假设我想要获取所有具有特定元键和元值的用户。这是我目前的查询(根据可用的 meta_keys 通过 PHP 生成):
SELECT ID,
user_email,
user_login,
first_name.meta_value as first_name,
last_name.meta_value as last_name,
phone_number.meta_value as phone_number,
wp_capabilities.meta_value as wp_capabilities
FROM wp_users,
(select * from wp_usermeta where meta_key = 'first_name') as first_name,
(select * from wp_usermeta where meta_key = 'last_name') as last_name,
(select * from wp_usermeta where meta_key = 'phone_number') as phone_number,
(select * from wp_usermeta where meta_key = 'wp_capabilities') as wp_capabilities
WHERE
ID = first_name.user_id AND
ID = last_name.user_id AND
ID = phone_number.user_id AND
ID = wp_capabilities.user_id AND
wp_wpi_capabilities.meta_value LIKE '%administrator%'
ORDER BY first_name
这很好,但是如果某个用户缺少 meta_key,例如“last_name”,则根本不会返回该用户行。所以我真正需要的是一种为缺少的元键返回 Null 值的方法。
现在我有一个非常 hackish 的函数,它会为所有没有给定 meta_key 的用户创建空白的 meta_keys 和 meta_values,这样他们就会被返回。这是一种糟糕的方式,当你有超过一千个用户时,你需要添加一种新的 meta_key。
让我知道是否有人这样做过,或者我是否需要更好地解释。
谢谢。
最佳答案
将 usermeta 连接条件放在连接中,而不是在子查询中苦苦挣扎:
SELECT
ID, user_email, user_login,
first_name.meta_value as first_name,
last_name.meta_value as last_name,
phone_number.meta_value as phone_number,
wp_capabilities.meta_value as wp_capabilities
FROM wp_users
JOIN wp_usermeta AS wp_capabilities ON wp_capabilities.user_id=ID
AND wp_capabilities.meta_key='wp_capabilities'
LEFT JOIN wp_usermeta AS first_name ON first_name.user_id=ID
AND first_name.meta_key='first_name'
LEFT JOIN wp_usermeta AS last_name ON last_name.user_id=ID
AND last_name.meta_key='last_name'
LEFT JOIN wp_usermeta AS phone_number ON phone_number.user_id=ID
AND phone_number.meta_key='phone_number'
WHERE
wp_capabilities.meta_value LIKE '%administrator%'
ORDER BY
first_name
关于mysql - Compex MySQL Left Join 使用元表中的多个条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3735176/