我正在Wordpress上做一些数据库查询。我正在加入usermeta表和users表。
users表为每个用户都有一行。
user meta表为每个用户有多行,因为“meta_keys”(每个用户的元数据类别)可以包含所有类型的信息。
在一个查询中,我现在想创建一个结果集,每个用户只有一行,并且为所选的元键值定义了额外的列。
例如,有一个带有昵称的附加列-当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魔术可以用来做这件事,并将某些行的数据转换成新的“虚拟”列?
最佳答案
您所寻找的通常称为交叉表查询:
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)。