我正在撰写电子商务脚本,但偶然发现了一个问题:
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
是类别...每个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
答案 0 :(得分:1)
没有,因为列espval_id
在多个表上。你正在使用加入
您需要将表名明确指定为
tablename.colname IN (4)
AND
tablename.colname IN (10,11)
为什么AND而不是为什么不
tablename.colname IN (4,10,11)