MySQL:使用;在;有多个子查询?

MySQL:使用;在;有多个子查询?,sql,mysql,subquery,in-subquery,Sql,Mysql,Subquery,In Subquery,我正在尝试使用此查询: 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" ), (S

我正在尝试使用此查询:

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 我希望MySQL合并所有子查询的结果,并在主查询中使用相同的值作为in子句

因此,如果第一个子查询返回1,2,4,第二个子查询返回2,3,4,那么“in”子句将为:

WHERE P.PageID IN (2,4)
因为2和4是两个子查询的共同值

通过一个查询就可以做到这一点吗

更新:

我想把这个问题弄清楚一点

结果应将所有设置了指定筛选器的页面返回到特定值,包括设置了不属于查询一部分的额外筛选器的页面。换言之,我在一个有特定过滤器的页面上,向我展示我可以从这里进入的所有页面,这些页面都有相同的过滤器,并且还有一个额外的过滤器集

解释起来有点棘手,但我正在寻找一个结果集,其中包含具有其他过滤器集的页面,但不包括具有相同过滤器ID的不同值的页面

因此,在本例中,我们希望将过滤器1设置为值2,过滤器7设置为57的所有页面。我们还希望指定其他筛选器(除1和7外)的页面,但不希望将筛选器7设置为57以外的值的页面,也不希望将筛选器1设置为2以外的值的页面

使用样本数据更新

页面过滤器:

PageID FilterID FilterOptionID 297 2 5 297 7 57 297 9 141 305 2 5 101 2 5 101 7 57 页面ID筛选器ID筛选器选项ID 297 2 5 297 7 57 297 9 141 305 2 5 101 2 5 101 7 57 页码:

PageID PageName 297 Some Page 305 Another Page 101 A Stupid Page PageID PageName 297页 305另一页 101愚蠢的一页 在这种情况下,我应该能够问,“哪些页面的过滤器2设置为5,过滤器7设置为57,过滤器9设置为141”

答案应该是“只有297个”

经过思考和阅读疯狂的评论,我意识到这可能是你想要的。基本上,我创建的派生表创建了上面两个查询的交集

SELECT COUNT(PF.PageID) AS Total,P.PageID
FROM Pages P
LEFT JOIN (Select PF1.* from Pages_Filters PF1 
           INNER JOIN Page_Filters PF2 ON PF1.PageID = PF2.Page_ID
           WHERE PF1.FilterID = "1" AND PF2.FilterOptionID = "2"
             AND PF2.FilterID = "7" AND PF2.FilterOptionID = "57"
) PF ON PF.PageID=P.PageID
WHERE P.PageID !="283"
GROUP BY PF.PageID
您应该能够“合并”结果集

差不多

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
试试这个

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 GROUP_CONCAT(DISTINCT(PageID))
    FROM Pages_Filters
    WHERE (FilterID="1" AND FilterOptionID="2")
    AND (FilterID="7" AND FilterOptionID="57")
)
AND P.PageID !="283"
GROUP BY PF.PageID
或者你可以试试类似的东西


从该链接中

隔离生成页面ID列表的查询。您需要以返回所需值的单个查询结束。您可以这样做:

SELECT PageID P1 FROM Page_Filters
WHERE  FilterID = "1" AND FilterOptionID = "2" AND EXISTS
    (SELECT * FROM PageID P2 
    WHERE P2.PageID = P1.PageID AND FilterID = "7" AND FilterOptionID = "57")

@John-我的想法是一样的,但你不认为这不符合OP的标准,即他只想要2或子句结果的交集-但或将给出满足任一条件的所有值。特别是
,如果第一个子查询返回1,2,4,第二个子查询返回2,3,4,那么“in”子句将改为:WHERE P.PageID in(2,4)
to@Insane...I明白这一点,但这样会更有效率。@Nick。。不确定我是否能满足您的要求,但请告诉我。请查看上面的更新。这个答案和UNION ALL答案似乎返回了太多的结果。@Nick…请提供一些示例数据,因为您的问题和更新对我来说没有意义查询似乎不符合我的要求。。。但也许有什么办法可以像你建议的那样利用存在?也许可以使用“联合所有人存在”并得到我想要的,但我必须更多地使用它。祝你好运。如果你知道路,请把它贴上去。:)在这种情况下,
UNION
UNION ALL
更有效,因为
In
子句中的
In不能从
UNION ALL
带来的重复中获益。
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 GROUP_CONCAT(DISTINCT(PageID))
    FROM Pages_Filters
    WHERE (FilterID="1" AND FilterOptionID="2")
    AND (FilterID="7" AND FilterOptionID="57")
)
AND P.PageID !="283"
GROUP BY PF.PageID
SELECT PageID P1 FROM Page_Filters
WHERE  FilterID = "1" AND FilterOptionID = "2" AND EXISTS
    (SELECT * FROM PageID P2 
    WHERE P2.PageID = P1.PageID AND FilterID = "7" AND FilterOptionID = "57")