2017-03-27 82 views
0

我试图将两个表一起枢轴显示后端用户信息在我的WordPress站点的管理员只有部分,并且不能通过错误“MySQL说:'on子句'中的未知列'u.ID'” 数据结构是正确的,但我似乎无法超越这一点。Wordpress- MySQL说:'未知列'users.ID'在'条款'

select u.ID as name, 
um.* 
from users as u, usermeta as um 
join (
    select um.umeta_id, 
    max(case when meta_key='nickname' then meta_value end)as nickname, 
    max(case when meta_key='first_name' then meta_value end)as first_name 
    from usermeta as um 
    group by um.umeta_id) 
um on u.ID=um.umeta_id 
+2

不要混合,(旧连接语法)和JOIN语法 –

回答

0

两个建议:

1)不要混合老派的逗号连接语法与新JOIN关键字语法

2)使表的别名一份声明中唯一(唐”牛逼重用um别名)


我不认为我们需要两个连接到usermeta表。我怀疑,我们是想返回一个结果一样,将由该查询返回的一个:

SELECT u.id   AS name 
    , m.nickname  AS nickname 
    , m.first_name AS first_name 
    FROM users u 
    LEFT 
    JOIN (SELECT um.umeta_id 
      , MAX(CASE WHEN um.meta_key='nickname' THEN um.meta_value END) AS nickname 
      , MAX(CASE WHEN um.meta_key='first_name' THEN um.meta_value END) AS first_name 
      FROM usermeta um 
     GROUP 
      BY um.umeta_id 
     ) m 
    ON m.umeta_id = u.id 
ORDER BY u.id 

这只是一个猜测。如果没有规范,或者示例数据和预期结果,我们只是在猜测。


随访

作为替代的加入,我们可以在选择列表中使用相关子查询。例如:

SELECT u.id AS name 
    , (SELECT umn.meta_value 
      FROM usermeta umn 
      WHERE umn.umeta_id = u.id 
      AND umn.meta_key='nickname' 
      ORDER BY umn.meta_value DESC 
      LIMIT 1 
     ) AS nickname 
    , (SELECT umn.meta_value 
      FROM usermeta umn 
      WHERE umn.umeta_id = u.id 
      AND umn.meta_key='first_name' 
      ORDER BY umn.meta_value DESC 
      LIMIT 1 
     ) AS first_name 
    FROM users u 
ORDER BY u.id 

对于外部查询返回的行合理数量的,我们可以得到合理的表现,只要我们有usermeta表中定义合适的索引,领先的(umeta_id,meta_key)列。理想的覆盖指数也包括meta_value

这些子查询要由外部查询返回的每行执行,因此,那些能真正陷入瘫痪的性能,如果我们返回很多行。

+0

完美的作品,谢谢! –

+0

对不起,它为我提供了有关用户表中第一个结果ID的良好数据,但它并未完成所有行。 –

+0

此答案中的查询应该从用户表中返回*每*行,以及在usermeta表中找到匹配的昵称和名字。当找不到匹配的行时,昵称和first_name将为NULL。 (umeta_id列的命名对于引用users(id)的外键有点奇怪,umeta_id列是否包含来自用户的id值?这是否是正确的连接条件?在此的连接谓词查询是从原始查询中复制的......我没有任何示例数据,我所拥有的唯一规范是问题中的错误SQL。) – spencer7593