MySQL-连接表并将特定行转换为;虚拟的;柱

MySQL-连接表并将特定行转换为;虚拟的;柱,mysql,wordpress,Mysql,Wordpress,我正在Wordpress上做一些数据库查询。我正在加入usermeta表和users表 “用户”表中的每个用户都有一行。 usermeta表为每个用户有多行,因为“meta_键”(每个用户的元数据类别)可以包含所有类型的信息 在一个查询中,我现在想创建一个结果集,每个用户只有一行,并且为选定的meta_键值定义了额外的列 e、 g.有一个昵称的附加列-当usermeta.meta_键=‘昵称’时,它应该显示usermeta.meta_值的内容 这是我当前的查询,其中包含不需要的重复行 SELEC

我正在Wordpress上做一些数据库查询。我正在加入usermeta表和users表

“用户”表中的每个用户都有一行。 usermeta表为每个用户有多行,因为“meta_键”(每个用户的元数据类别)可以包含所有类型的信息

在一个查询中,我现在想创建一个结果集,每个用户只有一行,并且为选定的meta_键值定义了额外的列

e、 g.有一个昵称的附加列-当usermeta.meta_键=‘昵称’时,它应该显示usermeta.meta_值的内容

这是我当前的查询,其中包含不需要的重复行

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)。

是否可以在此语句中使用WHERE,例如,仅选择非订户的用户?我试过
其中M.meta\u key='wp\u capabilities'和M.meta\u value!='a:1:{s:10:“订阅者”;s:1:“1”}'
虽然它只选择非订阅者,但它不选择任何实际的元数据。@rayne-这确实是一个不同的问题,但是的,您可以只筛选具有该元数据属性的用户。您需要使用Exists或In函数。meta_值真的看起来像
a:1:{s:10:“订阅者”;s:1:“1”}
?!这将使搜索变得更加困难,因为您需要在字符串本身中搜索,这意味着您将最终扫描整个表,这将不会很好地执行。