我有一张表products
(id,条形码,catid,名称,描述......)我被要求将某些产品分配到多个类别。
最明显的解决方案是将catid从INT更改为VARCHAR,并使用分隔值,即1,2,5,其中1,2& 5是各种类别。
现在哪个SQL语句能为我完成这项工作?我已经找到了_in_set,但我认为它恰恰相反。
答案 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使查询类别变得更复杂,但是比在同一个表中具有带分隔值的字段更加关系数据库方式,这听起来像是编写查询的噩梦。