我目前正在使用过滤器表单来显示一组产品。产品名称位于表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
)
所以,首先,这确实有效;但是,我想知道我是否缺少一些简单易懂的简化此查询的方法。 。 。或者我应该接受这个并继续前进?
我尝试了许多不同类型的连接但没有成功。如果只选择一个滤波器,简单的LEFT JOIN将是完美的。当我需要处理多个过滤器选择时,我遇到了问题。
答案 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