mysql中的FIND_IN_SET

时间:2011-06-20 15:52:27

标签: mysql

我有一个查询从一堆表中获取信息,包括根据另一个表中字段的值将两列设置为1或0;你可以忽略绝大多数 - 我只关心两条IF线:

SELECT DISTINCT CONCAT(np.first_name,' ',np.last_name) AS name, np.last_name, np.id, np.title, nc.web_name AS company, xsp.image_file AS image,

IF(prx.people_role_id IN(7,8),1,0) AS rfac,
IF(prx.people_role_id = 8,1,0) AS dfac

FROM expo_speaker xsp

LEFT JOIN expo_session_speaker xssx ON xssx.speaker_id = xsp.speaker_id
LEFT JOIN expo_session xss ON xss.session_id = xssx.session_id
LEFT JOIN new_people np ON np.id = xsp.people_id
LEFT JOIN people_role_xref prx ON prx.people_id = np.id
LEFT JOIN new_company nc ON np.company_id = nc.id

WHERE np.active = 1
AND xss.session_id = $sym->id
GROUP BY np.title
ORDER BY np.last_name

当每个人只能有一个角色(由prx.people_role_id表示)时,这很好用。但是,最近需求发生了变化,每个用户现在可以拥有0到12个不同的角色(这个数字可以随时更改。)

我查看了find_in_set,但无法弄清楚如何将它与IN子句结合起来。我试过了group_concat(prx.people_role_id),它给了我一个逗号分隔的列表,列出了分配给用户的所有角色。如果我们只查找了一个角色,则可以很容易地使用find_in_set来查看该角色是否存在于已分配角色的列表中。但是我们对其中一个IF语句有两个可能的角色。如何组合这些函数(或任何其他函数)以确定group_concat列是包含7还是8?

1 个答案:

答案 0 :(得分:0)

知道了;

IF((find_in_set(7, group_concat(prx.people_role_id))) OR (find_in_set(8, group_concat(prx.people_role_id))),1,0) AS rfac,
IF(find_in_set(8, group_concat(prx.people_role_id)),1,0) as dfac