3

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

当我像 in(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'

请为此提出解决方案。

4

1 回答 1

5

采用FIND_IN_SET()

代替

omc.id IN(uf.`user_offers`)

尝试

FIND_IN_SET(omc.id, uf.`user_offers`) > 0

但是解决您的问题的最佳方法是正确规范化表格。不要在表中存储逗号分隔值。

我建议的模式设计是一个三表设计,其中它是一个Many-to-Many关系,

user_profile 表在此处列出所有配置文件

  • 用户 ID (PK)
  • 其他领域...

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

  • userID (FK)(也是 PK 或 UQ 列 categoryID)
  • 类别 ID (FK)

类别表在此处列出所有类别

  • 类别 ID (PK)
  • 其他领域...
于 2013-05-31T15:07:54.153 回答