检查mysql IN的条件是否无效

时间:2013-05-31 15:05:59

标签: mysql sql

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

请为此提出解决方案。

1 个答案:

答案 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表在此列出所有个人资料

  • userID(PK)
  • 其他字段......

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

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

类别表列出所有类别

  • categoryID(PK)
  • 其他字段......