MySQL:在多个子查询中使用“In”?

2024-02-26

我正在尝试使用这个查询:



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”。


您应该能够“合并”结果集并集联合/全部联合 http://dev.mysql.com/doc/refman/5.0/en/union.html

就像是

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"
    UNION ALL
    SELECT PageID
       FROM Pages_Filters
       WHERE FilterID="7"
       AND FilterOptionID="57"
)
AND P.PageID !="283"
GROUP BY PF.PageID
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL:在多个子查询中使用“In”? 的相关文章