【问题标题】:MySQL: How to associate a column alias with a specific JOIN clauseMySQL:如何将列别名与特定的 JOIN 子句相关联
【发布时间】:2012-12-20 11:11:15
【问题描述】:

我的查询使用几个LEFT JOINs 从几个表中提取结果。它目前工作正常。但是,我现在必须从同一个表列中获取两个不同的字段(但匹配不同的条件)。我不知道如何确保从正确的 LEFT JOIN 中分配了正确的列别名。有意义吗?

所以举个例子……

SELECT table1.user_id, table2.value AS school, table2.value AS language  FROM table1  
LEFT JOIN table2 ON table2.user_id = table1.user_id AND table2.key = 'school'
LEFT JOIN table2 ON table2.user_id = table1.user_id AND table2.key = 'language'

我需要具有相应JOIN 的列别名。我该怎么做?

作为参考,这是我的原始查询(没有辅助 JOIN):

SELECT wsat_ib.user_id, wpjb_resume.id resume_id, wpjb_resume.firstname, wpjb_resume.lastname, 
     wsat_ib.overall_score, wsat_ib.account_score, wsat_ib.econ_score, wsat_ib.math_score,
     wsat_ib.logic_score, wsat_ib.fsanaly_score, wsat_ib.corpval_score, wsat_ib.end_time, 
     GROUP_CONCAT(DISTINCT wp_usermeta.meta_value) AS target_employers, wpjb_field_value.value AS school, 
     GROUP_CONCAT(wpjb_application.job_id) AS applications FROM  `wsat_ib` 
    LEFT JOIN wp_usermeta ON wsat_ib.user_id = wp_usermeta.user_id
    LEFT JOIN wpjb_resume ON wsat_ib.user_id = wpjb_resume.user_id
    LEFT JOIN wpjb_field_value ON wpjb_resume.id=wpjb_field_value.job_id AND wpjb_field_value.field_id=3
    LEFT JOIN wpjb_application ON wpjb_application.user_id = wsat_ib.user_id 
    WHERE (wp_usermeta.meta_key = 'target_employer' AND (wp_usermeta.meta_value = 'public' OR wp_usermeta.meta_value=1523) AND wpjb_resume.is_active =1) AND (wpjb_resume.firstname='Xu' OR wpjb_resume.lastname='Xu') 
    GROUP BY wsat_ib.user_id, resume_id, wpjb_resume.firstname, wpjb_resume.lastname, wsat_ib.overall_score, wsat_ib.account_score, wsat_ib.econ_score, wsat_ib.math_score, wsat_ib.logic_score, wsat_ib.fsanaly_score, wsat_ib.corpval_score, wsat_ib.end_time, wpjb_field_value.value
     ORDER BY overall_score DESC LIMIT 0, 20;

这是我实施以下解决方案的早期尝试。我已将AS school 添加到 JOIN 子句中,但尚未为该表添加第二个 JOIN。由于某种原因,此版本不返回任何结果。

SELECT wsat_ib.user_id, wpjb_resume.id resume_id, wpjb_resume.firstname, wpjb_resume.lastname, 
 wsat_ib.overall_score, wsat_ib.account_score, wsat_ib.econ_score, wsat_ib.math_score,
 wsat_ib.logic_score, wsat_ib.fsanaly_score, wsat_ib.corpval_score, wsat_ib.end_time, 
 GROUP_CONCAT(DISTINCT wp_usermeta.meta_value) AS target_employers, wpjb_field_value.value AS school, 
 GROUP_CONCAT(wpjb_application.job_id) AS applications FROM  `wsat_ib` 
LEFT JOIN wp_usermeta ON wsat_ib.user_id = wp_usermeta.user_id
LEFT JOIN wpjb_resume ON wsat_ib.user_id = wpjb_resume.user_id
LEFT JOIN wpjb_field_value AS school ON wpjb_resume.id=wpjb_field_value.job_id AND wpjb_field_value.field_id=3
LEFT JOIN wpjb_application ON wpjb_application.user_id = wsat_ib.user_id 
WHERE (wp_usermeta.meta_key = 'target_employer' AND (wp_usermeta.meta_value = 'public' OR wp_usermeta.meta_value=1523) AND wpjb_resume.is_active =1) AND (wpjb_resume.firstname='Xu' OR wpjb_resume.lastname='Xu') 
GROUP BY wsat_ib.user_id, resume_id, wpjb_resume.firstname, wpjb_resume.lastname, wsat_ib.overall_score, wsat_ib.account_score, wsat_ib.econ_score, wsat_ib.math_score, wsat_ib.logic_score, wsat_ib.fsanaly_score, wsat_ib.corpval_score, wsat_ib.end_time, wpjb_field_value.value
 ORDER BY overall_score DESC LIMIT 0, 20;

【问题讨论】:

    标签: mysql sql join left-join


    【解决方案1】:

    您还需要为表加上别名,而不仅仅是列。

    SELECT table1.user_id, schools.value AS school, languages.value AS language
    FROM table1  
    LEFT JOIN table2 AS schools ON schools.user_id = table1.user_id
        AND schools.key = 'school'
    LEFT JOIN table2 AS languages ON languages.user_id = table1.user_id
        AND languages.key = 'language'
    

    如果一个表在查询中出现多次,您可以将每种外观类型视为一个实例。您需要命名表的每个实例以消除歧义。

    【讨论】:

    • 谢谢。我在上面对@Andomar 评论说,由于某种原因,当我将别名添加到 JOIN 中的表时,查询没有返回任何结果。我已经在上面包含了我的查询。您是否看到其中的任何内容会阻止它按预期工作?
    • @Emerson 是的,您没有为顶部示例查询中的表实例提供别名。在 wordpress 表的底部查询中,我没有看到任何连接两次的表,所以看不到这有什么关系。你应该加入哪个表两次?
    • 很抱歉给您带来了困惑。这是我在进行修改之前的原始查询。我现在将添加新查询(不起作用)...
    • 我挖得更深了,这似乎是语法问题(不是零结果):WordPress database error: [Unknown column 'wpjb_field_value.value' in 'field list']
    • @Emerson 这是因为您将wpjb_field_value 表别名为school。所以该字段是school.value,而不是wpjb_field_value.value。以我的回答中的查询为例。
    【解决方案2】:
    LEFT JOIN table2 as t2 ON t2.id = ...
                    ^^^^^^^
    

    as 可以省略,如:

    LEFT JOIN table2 t2 ON t2.id = ...
    

    【讨论】:

    • 太棒了!谢谢!只是出于好奇,通过多次加入同一张表来做我正在尝试的事情是否正常?有没有我想念的更好的方法?
    • EAV 设计(实体-属性-值)是完全正常的,但 EAV 本身并不是无可争议的。
    • 谢谢!这让人放心。但是我遇到了一些麻烦,当我在查询中将AS school 添加到相应的LEFT JOIN 时,我没有得到任何结果。我已经在 select 子句中使用和不使用原始 AS school 进行了尝试。任何想法我做错了什么?
    猜你喜欢
    • 1970-01-01
    • 2012-10-04
    • 2021-03-04
    • 1970-01-01
    • 1970-01-01
    • 2019-02-04
    • 2020-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多