我有2个表offer_master_catagory和user_profile,我将所有offer_master_catagory存储在user_profile表字段名user_offers中,格式为16,17,18.
我正在编写一个SQl来获取所有记录的优惠订阅状态是或否.但是当我替换user_offers字段动态时,我得不到正确的结果.
SELECT omc.id , omc.name,uf.user_offers,
IF(omc.id IN(uf.`user_offers`), 'Yes','No') AS STATUS FROM
`offer_master_catagory` AS omc
, `user_profile` AS uf
WHERE omc.status='1' AND omc.lang_code='en' AND uf.user_id='19'
Run Code Online (Sandbox Code Playgroud)
当我像(16,17,18)中更换硬编码的user_offer时,它显示正确的结果.
SELECT omc.id , omc.name,uf.user_offers,
IF(omc.id IN(16,17,18), 'Yes','No') AS STATUS FROM
`offer_master_catagory` AS omc
, `user_profile` AS uf
WHERE omc.status='1' AND omc.lang_code='en' AND uf.user_id='19'
Run Code Online (Sandbox Code Playgroud)
请为此建议解决方案.
使用 FIND_IN_SET()
代替
omc.id IN(uf.`user_offers`)
Run Code Online (Sandbox Code Playgroud)
尝试
FIND_IN_SET(omc.id, uf.`user_offers`) > 0
Run Code Online (Sandbox Code Playgroud)
但是问题的最佳解决方案是正确地规范化表格.不要在表中存储逗号分隔值.
我建议的架构设计是一个三表设计,它是一种Many-to-Many关系,
user_profile表(在此列出所有配置文件)
offer_master_catagory表 (列出每个配置文件的所有类别)
类别表 (在此列出所有类别)