Mysql SQL仅获取与用逗号分隔的完整数字匹配的行
我正在做一些显示特定类别下的商店的东西,但是我有一个问题,因为我将类似这样的商店的类别存储在一个带有类别id的记录中。"1,5,12". 现在的问题是,如果我想展示第2类的商店,它“误认为”第12类为第2类。这就是现在的SQLMysql 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进行操作,但我不
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