2012-09-20 49 views
0

我已經檢查前的職位,均未解決我的問題呢,任何幫助,將不勝感激Mysql的加入了3個表

MySQL查詢3個表(用戶,比賽,採訪)

想要返回指定Match的用戶名和麪試號(如果有面試號)。

但我不想將結果限制爲只有面試的用戶。我嘗試加入,但無法讓它爲3張桌子工作。

這裏是我迄今爲止在PHP中:

$query = "SELECT CONCAT(u.first_name,' ',u.last_name,'----',COALESCE(i.v_code,'')) as name, u.id as id 
FROM #__users as u 

JOIN #__bl_match as m ON ((u.team_id = m.team1_id) OR 
    (u.team_id = m.team2_id) OR 
    (u.team_id = m.team3_id AND m.team3_id != 0) OR 
    (u.team_id = m.team4_id AND m.team4_id != 0) OR 
    (u.team_id = m.team5_id AND m.team5_id != 0) OR 
    (u.team_id = m.team6_id AND m.team6_id != 0) OR 
    (u.team_id = m.team7_id AND m.team7_id != 0) OR 
    (u.team_id = m.team8_id AND m.team8_id != 0) OR 
    (u.team_id = m.team9_id AND m.team9_id != 0) OR 
    (u.team_id = m.team10_id AND m.team10_id != 0)) 
    AND m.id = ".$t_id."AND m.id != 0 

JOIN #__bl_interview as i ON i.u_id = u.id"; 

     $db->setQuery($query); 
    $parti12 = $db->loadObjectList(); 
+3

你試過左加入嗎? JOIN將僅提取加入表中具有相應實體的用戶。 – Tool

+0

只是改變了它。但是現在它不顯示用戶名,只是下拉框中的空格 – user1071915

+0

嘗試向#__bl_match表中添加LEFT JOIN。 – Tool

回答

0

如果你想,沒有面試的用戶,你需要使用LEFT JOIN面試表,但是這意味着面試人數該用戶將是NULL。

由於您將數字與SELECT列表中的用戶名連接在一起,因此當用戶的名稱沒有采訪時(因爲用NULL值連接字符串 - 或執行漂亮的操作對NULL值進行任何其他操作都會產生NULL結果)。

爲了避免這種情況,您必須處理i.v_code爲NULL的情況。典型的方式做到這一點在MySQL是與COALESCE function

SELECT CONCAT(u.first_name, ' ', u.last_name, '----', COALESCE(i.v_code,'')) as name, 
     u.id as id 
FROM #__users as u 
JOIN #__bl_match as m ON ((u.team_id = m.team1_id) OR 
    (u.team_id = m.team2_id) OR 
    (u.team_id = m.team3_id AND m.team3_id != 0) OR 
    (u.team_id = m.team4_id AND m.team4_id != 0) OR 
    (u.team_id = m.team5_id AND m.team5_id != 0) OR 
    (u.team_id = m.team6_id AND m.team6_id != 0) OR 
    (u.team_id = m.team7_id AND m.team7_id != 0) OR 
    (u.team_id = m.team8_id AND m.team8_id != 0) OR 
    (u.team_id = m.team9_id AND m.team9_id != 0) OR 
    (u.team_id = m.team10_id AND m.team10_id != 0)) 
    AND m.id = ".$t_id."AND m.id != 0 
LEFT JOIN #__bl_interview as i ON i.u_id = u.id" 

現在,給你申請的名稱格式,你可以與外來沒有隨後的採訪中代碼名稱後離開。如果你想避免這種情況,我們可以使用IF,而不是COALESCE得到聰明一點與我們的輸出,就像這樣:

SELECT CONCAT(u.first_name, ' ', u.last_name, IF(i.v_code, '---- ' + i.v_code, '')) as name 

注意那是什麼做:如果i.v_code不爲NULL,第一表達IF評估爲真,因此返回第二個表達式。否則,返回第三個表達式(空字符串) - 所以當i.v_code爲NULL時,您只輸出用戶的名稱。