我有一个存储用户组的“group_names”表。每个组都有一个管理员,可以是单个用户,也可以由其他组管理。目前由group_names.mgr_type确定。 INT值为1表示它是单个用户,值为2表示它是一个管理它的组。
例如,“一般用户”组可以由“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从不同的行中选择group_name),还是应该添加另一个表? 有关更简单/更有效的方法的任何建议吗?
谢谢!
答案 0 :(得分: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;
答案 1 :(得分: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
左连接到用户表以获取管理员名称(如果是用户)或加入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
答案 2 :(得分: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...