我正在尝试使用这个查询:
SELECT COUNT(PF.PageID) AS Total,P.PageID
FROM Pages P
LEFT JOIN Pages_Filters PF ON PF.PageID=P.PageID
WHERE P.PageID IN (
(SELECT PageID
FROM Pages_Filters
WHERE FilterID="1"
AND FilterOptionID="2"
),
(SELECT PageID
FROM Pages_Filters
WHERE FilterID="7"
AND FilterOptionID="57"
)
)
AND P.PageID !="283"
GROUP BY PF.PageID
这会产生错误:
Sub-query returns more than 1 row
我希望 MySQL 合并所有子查询的结果,并使用公共值作为主查询中的 IN 子句。
因此,如果第一个子查询返回 1,2,4,第二个子查询返回 2,3,4,则“in”子句将显示为:
WHERE P.PageID IN (2,4)
因为 2 和 4 是两个子查询共有的值。
通过一个查询可以实现这一点吗?
UPDATE:
我将尝试更好地澄清这个问题。
结果应返回将指定过滤器设置为特定值的所有页面,包括设置了不属于查询的额外过滤器的页面。换句话说,我所在的页面已设置了某些过滤器,向我显示我可以从这里转到的所有页面,这些页面具有相同的过滤器,并且具有一个附加的过滤器集。
解释起来有点棘手,但我正在寻找一个结果集,其中包含具有其他过滤器集的页面,但不包含具有相同过滤器 ID 的不同值的页面。
因此,在示例中,我们希望所有将过滤器 1 设置为值 2,并且将过滤器 7 设置为 57 的页面。我们还希望分配了其他过滤器(除了 1 和 7 之外)的页面,但不将过滤器 7 设置为值的页面57 以外的值,以及将过滤器 1 设置为 2 以外的值的 NOT 页面。
使用样本数据更新
页面_过滤器:
PageID FilterID FilterOptionID
297 2 5
297 7 57
297 9 141
305 2 5
101 2 5
101 7 57
Pages:
PageID PageName
297 Some Page
305 Another Page
101 A Stupid Page
在这种情况下,我应该能够问,“哪些页面将过滤器 2 设置为 5,将过滤器 7 设置为 57,并将过滤器 9 设置为 141”?
答案应该是“只有297”。