Mysql SQL仅获取与用逗号分隔的完整数字匹配的行

Mysql SQL仅获取与用逗号分隔的完整数字匹配的行,mysql,sql,Mysql,Sql,我正在做一些显示特定类别下的商店的东西,但是我有一个问题,因为我将类似这样的商店的类别存储在一个带有类别id的记录中。"1,5,12". 现在的问题是,如果我想展示第2类的商店,它“误认为”第12类为第2类。这就是现在的SQL SELECT * FROM shops WHERE shop_cats LIKE '%".$sqlid."%' LIMIT 8 有没有办法在SQL中用逗号分隔记录“shop_cats”,以便检查完整的数字?我能想到的唯一方法是获取所有的商店,并使用PHP进行操作,但我不

我正在做一些显示特定类别下的商店的东西,但是我有一个问题,因为我将类似这样的商店的类别存储在一个带有类别id的记录中。"1,5,12". 现在的问题是,如果我想展示第2类的商店,它“误认为”第12类为第2类。这就是现在的SQL

SELECT * FROM shops WHERE shop_cats LIKE '%".$sqlid."%' LIMIT 8

有没有办法在SQL中用逗号分隔记录“shop_cats”,以便检查完整的数字?我能想到的唯一方法是获取所有的商店,并使用PHP进行操作,但我不喜欢这样做,因为这会占用太多的资源。

如果可以,正确的解决方案应该是规范化表,即每个类别有一个单独的行,而不是使用逗号

如果您不能,这应该可以完成以下工作:

SELECT * FROM shops WHERE CONCAT(',' , shop_cats , ',') LIKE '%,".$sqlid.",%' LIMIT 8

如果可以,正确的解决方案应该是规范化表,即每个类别有一个单独的行,而不是用逗号

如果您不能,这应该可以完成以下工作:

SELECT * FROM shops WHERE CONCAT(',' , shop_cats , ',') LIKE '%,".$sqlid.",%' LIMIT 8

这是一种非常非常糟糕的分类存储方式,原因有很多:

  • 您正在将数字存储为字符串
  • 不能声明正确的外键关系
  • 表中的(普通)列应该只有一个值
  • SQL的字符串函数很差
  • 结果查询不能利用索引
在数据库中存储此信息的正确方法是使用连接表,每个商店和每个类别有一行

有时,我们会被其他人糟糕的设计决策所困扰。如果这是您的情况,那么您可以使用
FIND\u IN\u SET()


但是您应该真正修复数据结构。

这是一种非常非常糟糕的存储类别的方法,原因有很多:

  • 您正在将数字存储为字符串
  • 不能声明正确的外键关系
  • 表中的(普通)列应该只有一个值
  • SQL的字符串函数很差
  • 结果查询不能利用索引
在数据库中存储此信息的正确方法是使用连接表,每个商店和每个类别有一行

有时,我们会被其他人糟糕的设计决策所困扰。如果这是您的情况,那么您可以使用
FIND\u IN\u SET()


但是您应该真正修复数据结构。

shops
不遵循1NF(第一范式),即:;每一列应该正好有一个值。为了避免这种情况,您需要创建另一个名为pivot table的表,该表关联两个表(或实体)。但是为了回答您的问题,下面的SQL查询应该可以做到这一点

SELECT * FROM shops WHERE concat(',',shop_cats,',') LIKE '%,".$sqlid.",%' LIMIT 8

shops
不遵循1NF(第一范式),即:;每一列应该正好有一个值。为了避免这种情况,您需要创建另一个名为pivot table的表,该表关联两个表(或实体)。但是为了回答您的问题,下面的SQL查询应该可以做到这一点

SELECT * FROM shops WHERE concat(',',shop_cats,',') LIKE '%,".$sqlid.",%' LIMIT 8

您需要在()中使用
,并且应该已经规范化了数据库。编辑:在看到@MarkBaker的评论后,这也是我想添加的内容。您现在需要测试这两种情况。。因此,测试shop_cats是否以
2,
开头,并测试字符串是否类似
,2,
。此外,这在数据库规范化中是一种不好的做法。您应该将它们存储在一个单独的表(透视表)中。规范化您的数据库是最好的解决方案:使用MySQL的FIND_in_SET()函数是一个效率低下但正确的工作区使用MySQL的函数。您需要在()中使用
,并且应该规范化您的数据库。编辑:在看到@MarkBaker的评论后,这也是我想添加的内容。您现在需要测试这两种情况。。因此,测试shop_cats是否以
2,
开头,并测试字符串是否类似
,2,
。此外,这在数据库规范化中是一种不好的做法。你应该将它们存储在一个单独的表,一个透视表中。规范化你的数据库是最好的解决方案:使用MySQL的FIND_in_SET()函数是一个效率低下但正确的工作区使用MySQL的函数。是的,你是对的,我确实想过将其分开,但当时它似乎会占用更多的资源(因为有更多的记录)。谢谢:)顺便说一句,我有一个单独的分类表,但我这样做是为了把分类指向一家商店,你对此有其他建议吗?@Anders。你应该使用一个连接表,每个商店和类别有一行。是的,你是对的,我确实想过把它分开,但当时它似乎会占用更多的资源(因为更多的记录)。不过谢谢:)顺便问一下,我确实有一个单独的分类表,但我这样做是为了把分类指向一家商店,你对此有其他建议吗?@Anders。您应该使用每个商店和每个类别一行的连接表。谢谢您的帮助,祝您愉快。嗯,对于分类,我在一个名为“分类”的表格中为每个分类都有一行,但我这样做是为了将特定的分类指向商店。我误解你了吗谢谢你的帮助,祝你今天愉快。嗯,对于分类,我在一个名为“分类”的表格中为每个分类都有一行,但我这样做是为了将特定的分类指向商店。我误解你了吗P