2

我正在尝试使用此查询:

选择计数(PF.PageID)作为总计,P.PageID
从页面 P
左连接 Pages_Filters PF ON PF.PageID=P.PageID
P.PageID 在哪里(
    (选择页面 ID
       FROM Pages_Filters
       过滤器ID =“1”
       AND FilterOptionID="2"
    ),
    (选择页面 ID
       FROM Pages_Filters
       过滤器ID =“7”
       AND FilterOptionID="57"
    )
)
和 P.PageID !="283"
按 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 是两个子查询的共同值。

这可以通过一个查询来实现吗?

更新:

我将尝试更好地澄清这个问题。

结果应返回将指定过滤器设置为特定值的所有页面,包括设置了不属于查询的额外过滤器的页面。换句话说,我在一个设置了某些过滤器的页面上,向我展示了我可以从这里访问的所有具有这些相同过滤器的页面,并设置了一个额外的过滤器。

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

因此,在示例中,我们希望将过滤器 1 设置为值 2 和过滤器 7 设置为 57 的所有页面。我们还希望分配了其他过滤器(除了 1 和 7)的页面,但不希望将过滤器 7 设置为 a 的页面57 以外的值,而不是将过滤器 1 设置为 2 以外的值的页面。

使用样本数据更新

Pages_Filters:

PageID FilterID FilterOptionID
297 2 5
297 7 57
297 9 141
305 2 5
101 2 5
101 7 57

页数:

PageID 页面名称
第297页
305 另一页
101 愚蠢的一页

在这种情况下,我应该能够问,“哪些页面的过滤器 2 设置为 5,过滤器 7 也设置为 57,过滤器 9 也设置为 141”?

答案应该是“只有 297”。

4

4 回答 4

1

隔离生成 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")
于 2010-11-22T18:55:23.377 回答
1

尝试这个

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

或者你可以尝试类似的东西

http://dev.mysql.com/doc/refman/5.0/en/exists-and-not-exists-subqueries.html

从这个链接

于 2010-11-22T05:36:32.097 回答
1
SELECT COUNT(PF.PageID) AS Total,P.PageID
FROM Pages P
LEFT JOIN Pages_Filters PF ON PF.PageID=P.PageID
WHERE (PF.FilterID="1"
       AND PF.FilterOptionID="2")
    OR (PF.FilterID="7"
       AND PF.FilterOptionID="57" )
AND P.PageID !="283"
GROUP BY PF.PageID

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

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
于 2010-11-22T04:12:36.330 回答
1

您应该能够“合并”结果集 union UNION/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 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
于 2010-11-22T04:19:48.893 回答