我正在编写电子商务脚本,但偶然发现了一个问题:
MySQL 无法使用 WHERE cat_id = 'software' AND attr_id IN (1,2) AND attr_id IN (3,4)
,因为它认为不明确。
所以,解释一下数据库逻辑是这样的:
attrTitle
是 attr
的标题。示例:“操作系统”、“许可证类型”
attr
保存与 attrTitle
相关的属性。每个product
可以有多个attr
,并且每个attr
都通过FK链接到attrTitle
。 attr
示例:“Windows”、“Linux”、“免费软件”
product
是...嗯...产品。示例:“Microsoft Office”
和category
是类别...每个产品
仅链接到一个类别...示例:“办公套件”
因此,我希望用户能够过滤“办公套件”类别中的产品。为此,他有一个菜单说:
[FILTERS]
*Operating System
- Windows
- Linux
- Mac
*Language
- English
- Español
因此,假设用户正在寻找可在 Windows 中运行的 Office 套件,并且是英语或西类牙语版本。
查询变成这样:
SELECT *
FROM prd_product p0_
INNER JOIN cat_category c2_
ON p0_.cat_id = c2_.cat_id
LEFT JOIN prd_attr p4_
ON p0_.prd_id = p4_.prd_id
LEFT JOIN attr_attributeValue e3_
ON e3_.attr_id = p4_.attr_id
WHERE c2_.cat_friendlyUrl = 'software'
AND e3_.attr_id IN (4)
AND e3_.attr_id IN (10,11)
GROUP BY p0_.prd_id
但是,正如我所说,它对于 MySQL 来说变得不明确,因为 espval_id 两次获取 WHERE IN 子句,然后返回空结果。谁能告诉我如何解决这个问题?
是的,我测试过,有一个产品具有 attr 4 和 attr 10
编辑: Sql Fiddle:http://sqlfiddle.com/#!2/be3198/1
最佳答案
否,因为列 espval_id
位于多个表中。并且您正在使用 join
您需要将表名显式指定为
tablename.colname IN (4)
AND
tablename.colname IN (10,11)
为什么“AND”而不是“为什么不”
tablename.colname IN (4,10,11)
关于php - 类别过滤器 IN 和电子商务 IN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22665603/