在逗号分隔的ID中编写MySQL中的where子句查询

时间:2016-04-18 10:17:12

标签: php mysql where-clause

我的帖子表中有很多博客帖子。假设,

+----+----------------------+-------------------------+
| id | title                | categories              | 
+----+----------------------+-------------------------+
| 1  | title 1              | 234, 235, 243           | 
| 2  | title 2              | 237                     |
| 2  | title 3              | 234, 243                |
+----+----------------------+-------------------------+

现在,我正在尝试选择类别243的所有帖子。我已经尝试使用FIND_IN_SET函数,如果id是类别字段中的第一个数字,则可以选择帖子。

我目前的查询是这样的 - SELECT * FROM posts WHERE FIND_IN_SET(235, Category) <> 0 ORDER BY PostId DESC

提前致谢。

1 个答案:

答案 0 :(得分:3)

您应该知道将类别存储在此类列表中的想法有多糟糕。以下是一些原因:

  • 将数字存储为字符串很糟糕。
  • SQL的字符串操作功能相对较差。
  • 生成的查询无法使用索引。
  • 无法声明外键约束。

因此,您应该修复数据以使用联结表。

有时,我们对其他人的糟糕设计决定感到震惊。

在这种情况下,问题会出现在列表中的空格中。试试这个:

WHERE FIND_IN_SET(235, replace(Category, ' ', '') > 0

或者,或者:

WHERE CONCAT(', ', 235, ', ') LIKE CONCAT('%, ', Category, ', %')

但是,我建议您正确使用关系数据结构并实现联结表。