许多类别中的一种产品 - PHP MySQL

时间:2011-07-13 14:51:34

标签: php mysql

我有一张表products(id,条形码,catid,名称,描述......)我被要求将某些产品分配到多个类别。 最明显的解决方案是将catid从INT更改为VARCHAR,并使用分隔值,即1,2,5,其中1,2& 5是各种类别。

现在哪个SQL语句能为我完成这项工作?我已经找到了_in_set,但我认为它恰恰相反。

5 个答案:

答案 0 :(得分:5)

最明显的解决方案是创建一个“交叉表”,您可以在其中执行多对多分配(因为在一个类别中可以包含许多产品,而一个产品可以包含多个类别)。这个表看起来像这样:

product_id | category_id

然后您可以使用此查询:

SELECT 
  *
FROM 
  (product JOIN product_has_category ON product.id = product_has_category.product_id) 
      JOIN category ON product_has_category.category_id = category.id

您甚至可以使用普通WHERE和“ORDER BY等”

编辑:修复了我的查询中的一个重大错误!


如果您无法更改数据库,可能需要尝试:

SELECT 
  *
FROM 
  category, product
WHERE
  product.id = ?? AND FIND_IN_SET(category.id, product.catid) > 0 GROUP BY product.id

警告:这是一个很长的镜头,我没有对此进行测试,但是当FIND_IN_SET搜索逗号分隔的列表时,它可以正常工作。

答案 1 :(得分:3)

不要在单个字段中划分您的类别提示。你正在为自己的痛苦做好准备。使用多对多关系。

products:
id,
barcode
...

category:
cat_id,
cat_name

product_category:
product_id
cat_id

获取特定类别的所有产品:

SELECT * FROM products JOIN product_category ON product_id=id WHERE cat_id=?

获取产品的所有类别

SELECT * FROM category JOIN product_category ON product_category.cat_id = category.cat_id WHERE product_id=?

答案 2 :(得分:1)

您最好的选择是拥有一个单独的表格,其中包含每个产品的“类别”和条目。以这种方式标准化。

如果您不想这样做,请使用位掩码。它比解析以逗号分隔的条目列表容易得多。

答案 3 :(得分:0)

删除catid并使用一个表将id与每行一个catid相关联(交叉表)。

答案 4 :(得分:0)

我建议更好的解决方案是建立第二个表格,将产品ID映射到类别,每个类别的条目与产品匹配。它通过必须使用JOIN使查询类别变得更复杂,但是比在同一个表中具有带分隔值的字段更加关系数据库方式,这听起来像是编写查询的噩梦。