我在Wordpress上做一些数据库查询。我正在加入usermeta表和users表。
users表每个用户只有一行。 usermeta表为每个用户提供了多行,因为“meta_keys”(每个用户的元数据类别)可以包含所有类型的信息。
在一个查询中,我现在想要创建一个结果集,每个用户只有一行,并且定义了所选meta_key值的附加列。
e.g。有一个带有昵称的附加列 - 当usermeta.meta_keys ='昵称'时,它应该显示usermeta.meta_value的内容。
这是我当前查询中不需要的行重复
SELECT
wusers.ID,
wusers.user_login,
wusers.display_name,
wmeta.meta_key,
wmeta.meta_value,
wmeta.user_id
FROM
$wpdb->users wusers
INNER JOIN $wpdb->usermeta wmeta ON wusers.ID = wmeta.user_id
WHERE 1 = 1
AND wmeta.meta_key = 'nickname'
OR wmeta.meta_key = 'description'
OR wmeta.meta_key = 'userphoto_thumb_file'
我可以使用任何MySQL魔法来执行此操作并将某些行的数据转换为新的“虚拟”列吗?
答案 0 :(得分:3)
您所寻求的通常称为交叉表查询:
Select U.Id
, Min( Case When M.meta_key = 'nickname' Then M.meta_value End ) As nickname
, Min( Case When M.meta_key = 'description' Then M.meta_value End ) As description
, Min( Case When M.meta_key = 'userphoto_thumb_file' Then M.meta_value End ) As userphoto_thumb_file
From users As U
Join usermeta As M
On M.user_id = U.id
Group By U.id
应该注意,您只能使用静态SQL和静态列执行此操作。 SQL语言本身并不是专为动态列生成而设计的。要动态组合列,您需要在中间层代码中动态组装查询(也称为动态SQL)。