Mysql 如何选择喜欢的号码?

Mysql 如何选择喜欢的号码?,mysql,sql,sql-like,Mysql,Sql,Sql Like,我有一堆产品和一堆分类页面。一种产品可以分为多个类别。所以在我的数据库中有一个products表,其中有一个“categories”列。在本列中,我存储当前产品存储的所有类别的ID,它是一个用分号分隔的字符串 例如:1;5.23;35;49; 当我浏览到分类页面ID5时,我想看到所有具有5的产品在其“类别”列中。我目前是通过 SELECT * FROM products WHERE categories LIKE "%".category.";%" 问题是,这不只是匹配5个。匹配15或25也是

我有一堆产品和一堆分类页面。一种产品可以分为多个类别。所以在我的数据库中有一个products表,其中有一个“categories”列。在本列中,我存储当前产品存储的所有类别的ID,它是一个用分号分隔的字符串

例如:
1;5.23;35;49;

当我浏览到分类页面ID5时,我想看到所有具有
5的产品在其“类别”列中。我目前是通过

SELECT * FROM products WHERE categories LIKE "%".category.";%"
问题是,这不只是匹配5个。匹配
15或<代码>25也是

因此,问题是:

  • 如何确保只选择所需号码?如果类别是“5”,我不希望它匹配15、25、35等等
  • 也许这是存储类别ID的一种非常糟糕的方法。您有没有关于存储属于哪个类别的产品的不同方法的建议

  • 对您的两个问题的回答/评论:

  • 我认为,在不修改模式的情况下实现这一点的唯一方法是使用MySQL正则表达式,但这并不是一个好主意。不过,请参阅以获取文档

  • 你说得对-这不是存储类别的好方法。您需要的是连接,也称为连接表(请参阅)。一种方法是有三个表:
    product
    category
    ,以及一个
    product\u categories
    表。产品和类别将有一个唯一的ID,正如您已经拥有的一样,并且产品类别表将有两列:产品类别ID和类别ID。如果产品1属于类别10和11,则产品类别表中将有两行:1,10和1,11


  • 如果您需要更多帮助,我可以详细说明,但这应该可以让您开始正确地重新设计数据库。

    您可以尝试将您的相似条件更改为“%;”.category.;“%”

    其他人提到连接表是设计数据库的正确方法。SQL有一个非常好的数据结构来存储列表。它不是一个“字符串”,而是一个“表”

    但是,有时人们会被这种格式的数据所困扰,需要使用它。在这种情况下,关键是将分隔符放在两侧,以防止出现问题:

    SELECT *
    FROM products
    WHERE concat(';', categories) LIKE "%;".category.";%"
    
    您的列表已经以分号结尾,因此没有必要这样做

    另一个更典型的MySQL解决方案是
    find_in_set()


    它是为逗号分隔的列表设计的。奇怪的是,MySQL在以这种方式存储列表时支持这样一个函数,这通常是一个坏主意,但确实如此。不过,出于性能原因(以及其他原因),连接表更好。

    好吧,这是您的问题,请阅读有关数据库(仅google 1NF)中与字符串中的第一个数字不匹配的标准化。例1;2.3.4.它不匹配1;
    SELECT *
    FROM products
    WHERE find_in_set(category, replace(categories, ';', ',') > 0;