【问题标题】:Table name alias scope in sub-select query子选择查询中的表名别名范围
【发布时间】:2012-06-15 10:38:35
【问题描述】:

请查看下面的查询 - 我收到 Unknown column 'u.id' in 'on clause'

SELECT id, username, 

coalesce(
 (SELECT name from company c 
    INNER JOIN user_company uc 
    ON uc.user_id = u.id 
    AND c.id = uc.company_id), 'NOT-AVAILABLE' 
) companyname

FROM `user` u

【问题讨论】:

  • 用户表真的有列id吗?
  • 尝试将子查询更改为:SELECT name from company c INNER JOIN user_company uc ON c.id = uc.company_id WHERE uc.user_id = u.id
  • 这是一个gasping at straws 答案,所以我将其作为评论:) 将uc.user_id = u.id 移动到相关子查询的WHERE 子句中? [另外,你不能在主查询中 LEFT JOIN 吗?]
  • Dems - 是的,它就是这样工作的 - 太棒了!

标签: php mysql sql phpmyadmin


【解决方案1】:

根据您的评论,关联不能放在关联子查询的JOIN 内。

但是,它可以放在相关子查询的WHERE 子句中。

SELECT
  id,
  username,
  coalesce(
    (SELECT name
       FROM company      c
 INNER JOIN user_company uc
         ON c.id = uc.company_id
      WHERE uc.user_id = u.id
    ),
    'NOT-AVAILABLE'
  ) companyname
FROM
  `user` u 

这回答了您明确的问题;为什么您的查询在语法上失败。


不过,我会用简单的LEFT JOIN 替换整个关联。

SELECT
  u.id,
  u.username,
  COALESCE(c.name, 'NOT-AVAILABLE') companyname
FROM
  `user` u 
LEFT JOIN
  `user_company` uc
      ON uc.user_id = u.id
LEFT JOIN
  `company` c
    ON c.id = uc.company_id

【讨论】:

    【解决方案2】:

    一种解决方法:

    SELECT u.id,
           u.username,
           COALESCE(aux.name, 'NOT-AVAILABLE') as 'companyname'
    FROM `user` u
    LEFT JOIN
     (SELECT user_id, name from company c 
        INNER JOIN user_company uc
        ON c.id = uc.company_id) aux ON aux.user_id = u.id
    

    另一种解决方法:

    SELECT u.id,
           u.username,
           COALESCE(c.name, 'NOT-AVAILABLE') AS 'companyname'
    FROM `user` u
    LEFT JOIN user_company uc ON uc.user_id = u.id 
    LEFT JOIN company c ON c.id = uc.company_id
    

    【讨论】:

    • 第一个查询中有错字 - 但两者都有效 - 谢谢!
    • @user1421214 那么您应该投票并接受答案。错字已修复! :)
    • +1 来自我 - 但我接受了 Dems 的回答......对不起,但我也非常感谢你的回答。 :)
    • 哦,没问题 :) 没注意到他的回答^^
    • 实际上他一开始发表了评论 - 我试过它有效 - 然后我检查了你的答案 - 无论如何谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-02
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    • 2011-12-21
    相关资源
    最近更新 更多