简化筛选器选择的查询

时间:2016-03-14 14:27:28

标签: mysql sql filter

我目前正在使用过滤器表单来显示一组产品。产品名称位于表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将是完美的。当我需要处理多个过滤器选择时,我遇到了问题。

2 个答案:

答案 0 :(得分: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
        )

解决方案2使用INNER JOIN:

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)

答案 1 :(得分:0)

你可以试试这样的交叉申请,

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