【问题标题】:Select product with properties by group按组选择具有属性的产品
【发布时间】:2016-06-29 20:59:49
【问题描述】:

产品表:

id
1
2
3

产品属性

product_id   prop_id
1            1
1            2
1            3
2            2
2            3
3            1   
4            2
5            1
5            3

道具有组。例如,prop_id (1, 2) 是组 #1,prop_id (3) - 组 #2。 我需要选择包含第 1 组中的一个道具和第 2 组中的一个道具的产品。

像这样

select * from product_properties WHERE prop_id IN (1, 2) AND prop_id IN (3)

但它不起作用,如何创建类似的正确查询?

该查询必须返回 ID 为 1、2、3 的产品。

【问题讨论】:

    标签: mysql sql join


    【解决方案1】:

    可能是这样的:

    SELECT a.product_id, a.prop_id, b.prop_id
    FROM product_properties a, product_properties b
    WHERE 
        a.product_id=b.product_id AND 
        a.prop_id IN (1, 2) AND 
        b.prop_id = 3
    

    【讨论】:

    • 如果我有超过 2 个属性组查询将如下所示:SELECT * FROM product_property_params a, product_property_params b, product_property_params c WHERE a.product_id=b.product_id AND a.product_id=c.product_id AND a.param_id IN (23, 24) AND c.param_id = 26 AND b.param_id = 27
    • 你怎么知道哪些属性属于哪个组?
    • 我有第 3 个带有道具组的表格,但是通过表格产品属性实现的关系“道具与产品”。
    • 推广使用 explict JOIN sintaxis,Aaron Bertrand 写了一篇很好的文章 Bad habits to kick : using old-style JOINs 关于它。
    【解决方案2】:
    SELECT product_id
    FROM product_properties
    GROUP BY product_id
    HAVING COUNT(CASE WHEN prop_id IN (1, 2) THEN 1 END) > 0 -- mean have at least one property with 1 or 2
       AND COUNT(CASE WHEN prop_id = 3       THEN 1 END) = 1 -- mean has property 3
    

    这假设一个产品不能多次拥有相同的属性。

    【讨论】:

    • 不,不是。但是你应该尝试解释计划,看看是否需要product_id的索引
    • 我的 orm 不接受 WHEN 有,还有其他方法吗?
    • 你的意思是ORM?这是标准 SQL。
    • 我正在使用框架(包括自己的 ORM)$builder->having('COUNT(CASE WHEN Common\Models\ProductPropertyParams.param_id IN (23, 24) THEN 1 END) > 0'); 在 php 中编写此代码,结果不支持 CASE 子句。在支持论坛中,他们建议将原因替换为 if。
    猜你喜欢
    • 2014-07-16
    • 2017-03-17
    • 1970-01-01
    • 1970-01-01
    • 2013-04-23
    • 1970-01-01
    • 2020-08-20
    • 1970-01-01
    • 2015-03-24
    相关资源
    最近更新 更多