我有一张桌子products(id,条形码,catid,名称,描述等),并被要求将某些产品分配到多个类别中成为可能。最明显的解决方案是将Catid从INT更改为带有定界值的VARCHAR,即1,2,5,其中1,2和5是各种类别。
现在,哪个SQL语句将为我完成工作?我想到的是find_in_set,但我认为相反。
最明显的解决方案是创建一个“跨表”,您可以在其中进行多对多分配(因为在一个类别中可以有许多产品,而一个产品可以有许多类别)。该表如下所示:
product_id | category_id
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用以下查询:
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
Run Code Online (Sandbox Code Playgroud)
您甚至可以使用normal WHERE和`ORDER BY等。
编辑:修复了我的查询,我的应用中的重大错误!
如果无法更改数据库,则可能需要尝试以下操作:
SELECT
*
FROM
category, product
WHERE
product.id = ?? AND FIND_IN_SET(category.id, product.catid) > 0 GROUP BY product.id
Run Code Online (Sandbox Code Playgroud)
警告:这是一个长镜头,我还没有测试过,但是由于FIND_IN_SET会搜索以逗号分隔的列表,因此可以使用。