【问题标题】:Simplifying Query for Filter Selection简化筛选器选择的查询
【发布时间】:2016-03-14 14:27:28
【问题描述】:

我目前正在使用过滤器表单来显示一组产品。产品名称位于表 a 中,过滤器标签位于表 b 中。选择过滤器后,查询需要返回表 a 中符合所有选择条件的所有产品。

我当前的查询是(这个例子选择了两个过滤器):

SELECT a.genus
    ,a.botanical
FROM a
WHERE a.ID IN (
        SELECT filter.filtered
        FROM (
            SELECT b.ID AS filtered
                ,COUNT(*) c
            FROM b
            WHERE b.tag_ID = 1
                OR b.tag_ID = 2
            GROUP BY b.ID
            HAVING c = 2
            ) AS filtered
        )

所以,首先,这确实有效;但是,我想知道是否缺少一些简化此查询的愚蠢简单的方法。 . .还是我应该接受这一点并继续前进?

SQL Fiddle here

我尝试了许多不同类型的连接,但都没有成功。如果只选择一个过滤器,那么简单的 LEFT JOIN 将是完美的。当我需要处理多个过滤器选择时会遇到问题。

【问题讨论】:

  • 您到底希望输出是什么?您的查询似乎运行良好..
  • 它工作正常。我真的在寻找一个不需要跟踪所选过滤器数量的查询(对于“HAVING c = x”),尽管我不完全确定这样的查询是否存在。

标签: mysql sql filter


【解决方案1】:

使用子查询的解决方案 1:

SELECT a.genus, a.botanical
FROM a
WHERE a.ID IN (
            SELECT b.ID
            FROM b
            WHERE b.tag_ID = 1
                OR b.tag_ID = 2
            GROUP BY b.ID
            HAVING COUNT(*) = 2
        )

使用 INNER JOIN 的解决方案 2:

SELECT a.genus, a.botanical
FROM a INNER JOIN 
    (   SELECT b.ID
        FROM b
        WHERE b.tag_ID IN (1,2)
        GROUP BY b.ID
        HAVING COUNT(*) = 2 ) b2
    USING(ID)

【讨论】:

  • 解决方案 2 的计算时间确实比我当前的查询要快。如果我仍然必须计算所选过滤器的数量,这可能是最好的选择。谢谢。
【解决方案2】:

你可以像这样尝试交叉应用,

SELECT a.genus
    ,a.botanical
FROM a
CROSS APPLY (
    SELECT b.ID
        ,COUNT(*) c
    FROM b
    WHERE (
            b.tag_ID = 1
            OR b.tag_ID = 2
            )
        AND a.ID = b.id
    GROUP BY b.ID
    HAVING c = 2
    ) b

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-13
    • 1970-01-01
    • 2020-08-29
    • 2021-02-25
    • 2012-07-20
    • 2010-11-15
    • 1970-01-01
    • 2018-12-26
    相关资源
    最近更新 更多