用于电子商务的类别过滤器IN和IN

时间:2014-03-26 15:22:57

标签: php mysql sql doctrine-orm

我正在撰写电子商务脚本,但偶然发现了一个问题: MySQL不能使用WHERE cat_id = 'software' AND attr_id IN (1,2) AND attr_id IN (3,4),因为它认为不明确。

所以,为了解释数据库逻辑,就像这样:

attrTitleattr的标题。示例:“操作系统”,“许可证类型

attr包含与attrTitle相关的属性。每个product可以包含多个attr,每个attr都可以通过FK链接到attrTitleattr的示例:“ Windows ”,“ Linux ”,“免费软件

product是......好......产品。示例:“ Microsoft Office

category是类别...每个product仅链接到一个类别...示例:“ Office套件

因此,我希望用户能够过滤“ Office套件”类别中的产品。为此,他有一个菜单说:

[FILTERS]

*Operating System
- Windows
- Linux
- Mac

*Language
- English
- Español

因此,假设用户正在寻找在Windows中使用的Office套件 AND 是英文或西班牙语。

查询变成了这样:

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

1 个答案:

答案 0 :(得分:1)

没有,因为列espval_id在多个表上。你正在使用加入

您需要将表名明确指定为

tablename.colname IN (4)
AND
tablename.colname IN (10,11)

为什么AND而不是为什么不

tablename.colname IN (4,10,11)