php - 类别过滤器 IN 和电子商务 IN

标签 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是类别...每个产品仅链接到一个类别...示例:“办公套件

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

[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/

相关文章:

javascript - 使用 jquery 在 php 中回显警报

mysql - 如何将不同的日期从数据库中的一列复制到另一个数据库中的另一列

sql - 来自 CDbCriteria 的 Yii SQL 查询

sql - Postgresql 数组包含条目的数量?

php - 用 while() 或 foreach() 查询显示结果

php - mysql 获取数组(LIKE%)

php - 使用 jdbc 或类似的东西的 Android 数据库连接

php - 如何将一行作为一个类进行回显?

mysql - 如何编写 Hive 脚本以在 Oozie 协调器中的 shell 变量中返回结果?

mysql - 如何向外键插入空值?