【问题标题】:Wordpress- MySQL said:' Unknown column 'users.ID' in 'on clause'Wordpress-MySQL 说:'on 子句中的未知列'users.ID'
【发布时间】:2017-03-27 13:37:05
【问题描述】:

我正在尝试将两个表组合在一起,以便在我的 wordpress 网站的仅管理员部分显示后端用户信息,但无法通过错误“MySQL 说:'on 子句'中的未知列 'u.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

【问题讨论】:

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

标签: mysql wordpress


【解决方案1】:

两个建议:

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 列表中使用相关子查询。例如:

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

这些子查询将为外部查询返回的每一行和每一行执行,因此如果我们返回大量行,这些子查询真的会降低性能。

【讨论】:

  • 抱歉,它为我提供了关于用户表中第一个结果 ID 的良好数据,但它并未针对所有行完成。
  • 此答案中的查询应返回users 表中的每一 行,以及在usermeta 表中找到的匹配昵称和名字。未找到匹配行时,昵称和 first_name 将为 NULL。 (对于引用 users(id) 的外键,umeta_id 列的命名让我觉得有点奇怪。umeta_id 列是否包含来自用户的 id 值?这是正确的连接条件吗?此查询中的连接谓词已复制从原始查询...我没有任何示例数据,我唯一的规范是问题中的错误 SQL。)
猜你喜欢
  • 2011-05-03
  • 1970-01-01
  • 2014-03-13
  • 1970-01-01
  • 2012-05-16
  • 2018-05-12
  • 2011-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多