2012-10-21 63 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...