2011-06-20 84 views
0

我有一個查詢,從一堆表中獲取信息,包括根據另一個表中的字段的值將兩列設置爲1或0;你可以忽略絕大多數它 - 我只關心兩個IF行:FIND_IN_SET在mysql

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表示)。但是,最近需求發生了變化,每個用戶現在可以擁有從零到十二個不同角色的任何位置(並且該編號可以隨時更改)。

我查看了find_in_set,但無法弄清楚如何組合它帶有IN子句。我試過group_concat(prx.people_role_id),它給了我一個分配給用戶的所有角色的以逗號分隔的列表。如果只有一個我們正在尋找的角色,那麼使用find_in_set來查看角色列表中是否存在該角色將很容易。但是對於其中一個IF語句,我們有兩個可能的角色。我如何組合這些函數(或任何其他)來確定group_concat列是包含7還是8?

回答

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