我有2个表offer_master_catagory和user_profile,我将所有offer_master_catagory存储在user_profile表字段名称user_offers中,格式为16,17,18。
我正在编写一个SQl来获取所有提供订阅状态为yes或no的记录。但是当我替换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'
当我像(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'
请为此提出解决方案。
答案 0 :(得分:5)
使用FIND_IN_SET()
而不是
omc.id IN(uf.`user_offers`)
试
FIND_IN_SET(omc.id, uf.`user_offers`) > 0
但问题的最佳解决方案是正确规范化表格。不要在表格中存储逗号分隔值。
我建议的架构设计是一个三表设计,它是Many-to-Many
关系,
user_profile表(在此列出所有个人资料)
offer_master_catagory表(列出每个配置文件的所有类别)
类别表(列出所有类别)