2013-01-06 44 views
2

我的查詢使用幾個LEFT JOIN從幾個表中抽取結果。目前它工作正常。但是,我現在必須從同一個表列中獲取兩個不同的字段(但匹配不同的條件)。我不知道如何確保從正確的LEFT JOIN分配正確的列別名。合理?MySQL:如何將列別名與特定的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; 

回答

3

您需要別名表爲好,不只是列。

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' 

如果一個表在查詢中多次出現,您可以將每種外觀類型視爲一個實例。您需要命名錶的每個實例以消除它們的歧義。

+0

謝謝。我在上面評論@Andomar,出於某種原因,當我在JOIN中向表中添加別名時,查詢沒有返回任何結果。我已經在上面包含了我的查詢。你有沒有看到任何會阻止它按預期工作的內容? – emersonthis

+0

@Emerson是的,你不會給頂部示例查詢中的表實例提供別名。在使用wordpress表的底部查詢中,我沒有看到任何連接兩次的表,所以不要看到這是如何相關的。你認爲哪張桌子加入了兩次? –

+0

對不起,我感到困惑。這是我進行修改之前的原始查詢。我現在將添加新的查詢(這不起作用)... – emersonthis

2
LEFT JOIN table2 as t2 ON t2.id = ... 
       ^^^^^^^ 

as可以省略,如:

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

非常好!謝謝!出於好奇,通過多次連接同一個表來做我想要做的事情是正常的嗎?有沒有更好的方式來做到這一點,我錯過了? – emersonthis

+0

EAV設計(實體屬性值)的EAV本身並不是無可爭議的。 – Andomar

+0

謝謝!這是令人放心的。但是我遇到了一些麻煩,當我在查詢中添加'AS school'到相應的'LEFT JOIN'時,我沒有任何結果。我已經在select子句中嘗試了使用和不使用最初的'AS school'。任何想法我做錯了什麼? – emersonthis

相關問題