检查mysql IN的条件是否无效

Bri*_*hor 3 mysql sql

我有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)

请为此建议解决方案.

Joh*_*Woo 5

使用 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表(在此列出所有配置文件)

  • userID(PK)
  • 其他领域......

offer_master_catagory表 (列出每个配置文件的所有类别)

  • userID(FK)(也是具有列categoryID的PK或UQ)
  • categoryID(FK)

类别表 (在此列出所有类别)

  • categoryID(PK)
  • 其他领域......