2012-10-21 143 views
2

我有一個存儲用戶組的「group_names」表。每個小組都有一個經理,可以是個人用戶,也可以由其他小組管理。這當前由group_names.mgr_type確定。 INT值爲1表示它是個人用戶,值爲2表示它是一個管理它的組。MySQL在IF語句內選擇

例如,「一般用戶」組可由「IT部門」組或「John Doe」管理。 users和group_names表上的唯一ID字段是「user_id」和「group_id」。

我想從PHP中取出邏輯並將其放入SQL查詢中,但我遇到了問題。我不確定這是可能的,因爲表格佈局或者我只是不能遵循文檔中提供的簡單說明。

SELECT gn.group_id, gn.group_name, ... gn.mgr_id, CONCAT(usr.user_firstname,' ',usr.user_lastname) AS created_name, usr.user_id, 
CASE gn.mgr_type 
    WHEN '1' THEN CONCAT(usr.user_firstname,' ',usr.user_lastname) WHERE usr.user_id=gn.mgr_id LIMIT 1 
    WHEN '2' THEN gn.group_name WHERE gn.group_id=gn.mgr_id LIMIT 1 
END AS mgr_name 
FROM group_names gn 
LEFT JOIN users usr 
ON gn.created_by=usr.user_id 
ORDER BY group_name ASC; 

我試過IF和CASE,有和沒有括號的不同變化,但不斷收到「無效語法」錯誤。

...for the right syntax to use near 'WHERE usr.user_id=gn.mgr_id LIMIT 1) WHEN '2' THEN (gn.group_name WHERE gn' at line 3 

可我甚至選擇同一表中的不同行(選擇一個不同的行基礎上,mgr_id = GROUP_ID的組名),或者我應該添加另一個表? 有關更簡單/更有效的方法來提供任何建議嗎?

謝謝!

回答

0

您是否嘗試過這一點,因爲你已經加入到這些表

CASE gn.mgr_type 
    WHEN '1' THEN CONCAT(mgr_usr .user_firstname,' ',mgr_usr .user_lastname) 
    WHEN '2' THEN mgr_grp.group_name 
END AS mgr_name 

實際上,你需要2個左加入該工作

LEFT JOIN users mgr_usr 
    ON gn.mgr_id = mgr_usr.user_id 
LEFT JOIN group_names mgr_grp 
    ON gn.mgr_id = mgr_grp.group_id 

大號EFT加入到用戶表來獲取經理的名字,如果是用戶或加入到GROUP_NAMES表中檢索組名,如果它是一組

可以限制JOIN的進一步

LEFT JOIN users mgr_usr 
    ON gn.mgr_id = mgr_usr.user_id AND gn.mgr_type = 1 
LEFT JOIN group_names mgr_grp 
    ON gn.mgr_id = mgr_grp.group_id AND gn.mgr_type = 2 
+0

感謝您的快速回復,此解決方案似乎工作得最好。 – Curtis

0

我想你應該嘗試這樣的事情(試行其中表的另一個實例的連接條件移動):

SELECT gn.group_id, gn.group_name, ... gn.mgr_id, 
     CONCAT(usr.user_firstname,' ',usr.user_lastname) AS created_name, 
     usr.user_id, 
     CASE gn.mgr_type 
     WHEN '1' THEN CONCAT(usr1.user_firstname,' ',usr1.user_lastname) 
     WHEN '2' THEN gn1.group_name 
     END AS mgr_name 
FROM group_names gn 
LEFT JOIN users usr 
ON gn.created_by=usr.user_id 
RIGHT OUTER JOIN users usr1 
ON usr1.user_id=gn.mgr_id LIMIT 1 
OUTER JOIN group_names gn1 
ON usr.user_id=gn1.mgr_id LIMIT 1 
ORDER BY group_name ASC; 
0

試試這個:

SELECT ... 
CASE WHEN gn.mgr_type = '1' 
    THEN CONCAT(usr.user_firstname,' ',usr.user_lastname) WHERE usr.user_id=gn.mgr_id LIMIT 1 
    ELSE gn.group_name WHERE gn.group_id=gn.mgr_id LIMIT 1 
    END AS mgr_name 
FROM group_names gn...