MySQL - 连接表并将特定行转换为“虚拟”列

时间:2011-02-12 22:21:06

标签: mysql wordpress

我在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魔法来执行此操作并将某些行的数据转换为新的“虚拟”列吗?

1 个答案:

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