Mysql 如何选择喜欢的号码?
我有一堆产品和一堆分类页面。一种产品可以分为多个类别。所以在我的数据库中有一个products表,其中有一个“categories”列。在本列中,我存储当前产品存储的所有类别的ID,它是一个用分号分隔的字符串 例如: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也是
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;