【问题标题】:Select a product from filters从过滤器中选择产品
【发布时间】:2023-03-18 02:12:02
【问题描述】:

我的查询有问题:

我有 3 张桌子: 产品(ID,名称) 设置(ID,名称) product_setting (product_id, setting_id)

例如:我想只选择您选择过滤器的产品!

我这样做:

SELECT p. *, s.id as setting
FROM Products p
INNER JOIN product_setting p2 ON (p.id = p2.product_id)
INNER JOIN settings s ON (s.id = p2.setting_id)
WHERE s.id IN (1,2)

但我得到了所有具有“设置”id = 1 或 id = 2 的产品。 如何只获得那些具有这些“设置”(AND)的产品?

谢谢!!

【问题讨论】:

    标签: mysql sql-match-all


    【解决方案1】:
    SELECT p.*, s.id as setting
    FROM Products p
    INNER JOIN product_setting p2 ON (p.id = p2.product_id)
    INNER JOIN settings s ON (s.id = p2.setting_id)
    WHERE s.id IN (1,2)
    GROUP BY p.id
    HAVING COUNT(*)=2; // size of IN()
    

    【讨论】:

    • 这似乎是过于放肆的数据。考虑可能存在多个设置的情况。虽然这是一个可以防止的外部问题,但如果允许错误数据进入系统,这很容易引入错误。
    【解决方案2】:

    这看起来有点过头了,但是......

    SELECT p. *, s.id as setting
    FROM Products p
    INNER JOIN product_setting p2 ON (p.id = p2.product_id)
    INNER JOIN settings s ON (s.id = p2.setting_id)
    INNER JOIN settings s2 ON (s.id = p2.setting_id)
    WHERE 
        s.id = 1
        AND s2.id = 2
    

    【讨论】:

    • s.id 不能同时存在于单行的 1 和 2 中
    猜你喜欢
    • 1970-01-01
    • 2016-11-13
    • 1970-01-01
    • 2016-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    相关资源
    最近更新 更多