我正在处理某个特定类别的商店,但我有一个问题,因为我将这样的商店类别存储在一个类别为id的记录中。 " 1,5,12&#34 ;.现在,问题是,如果我想展示类别2的商店,那么" misakens" 12作为类别2.现在是SQL。
SELECT * FROM shops WHERE shop_cats LIKE '%".$sqlid."%' LIMIT 8
有没有办法拆分记录" shop_cats"用SQL中的逗号,所以检查完整的数字?我能想到的唯一方法是获得所有的商店,并使用PHP来实现,但我不喜欢这样,因为它需要太多的资源。
答案 0 :(得分:4)
这是存储类别的一种非常非常糟糕的方式,原因有很多:
将此信息存储在数据库中的正确方法是使用联结表,每个商店和每个类别一行。
有时,我们会遇到其他人非常糟糕的设计决策。如果是这种情况,那么您可以使用FIND_IN_SET()
:
WHERE FIND_IN_SET($sqlid, shop_cats) > 0
但你应该真正修复数据结构。
答案 1 :(得分:3)
如果可以,正确的解决方案应该是规范化表格,即每个类别有一个单独的行,而不是逗号。
如果你不能,这应该做的工作:
filter
答案 2 :(得分:0)
表shops
不遵循1NF(第1范式),即;每列应该只有一个值。为了避免这种情况,您需要创建另一个名为pivot table的表,该表将两个表(或实体)相关联。但是要回答你的问题,下面的SQL查询应该可以解决问题。
SELECT * FROM shops WHERE concat(',',shop_cats,',') LIKE '%,".$sqlid.",%' LIMIT 8