MySQL:使用“In”使用多个子查询?
我正在尝试使用此查询:
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 是两个子查询共有的值。
通过一个查询可以实现这一点吗?
更新:
我将尝试更好地澄清这个问题。
结果应返回将指定过滤器设置为特定值的所有页面,包括设置了不属于查询的额外过滤器的页面。换句话说,我所在的页面已设置了某些过滤器,向我显示我可以从这里转到的所有页面,这些页面具有相同的过滤器,并且具有一个附加的过滤器集。
解释起来有点棘手,但我正在寻找一个结果集,其中包含具有其他过滤器集的页面,但不包含具有相同过滤器 ID 的不同值的页面。
因此,在示例中,我们希望所有将过滤器 1 设置为值 2,并且将过滤器 7 设置为 57 的页面。我们还希望分配了其他过滤器(除了 1 和 7 之外)的页面,但不将过滤器 7 设置为值的页面值不是 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 PageName 297 Some Page 305 Another Page 101 A Stupid Page
在这种情况下,我应该能够询问“哪些页面具有过滤器” 2 设置为 5,过滤器 7 设置为 57,过滤器 9 设置为 141"?
答案应该是“只有297”。
I'm trying to use this query:
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
Which produces the error:
Sub-query returns more than 1 row
I'd like for MySQL to merge the results of all the sub-queries, and use values in common as the IN clause in the main query.
So if the first sub-query returns 1,2,4 and the second sub-query returns 2,3,4, then the "in" clause would read:
WHERE P.PageID IN (2,4)
because 2 and 4 are the values the two sub-queries have in common.
Is this possible with one query?
UPDATE:
I'm going to try to clarify the question a bit better.
The result should return all of the pages which have the specified filters set to a specific value INCLUDING pages that have extra filters set which are not part of the query. In other words, I'm on a page with certain filters in place, show me all the pages that I can go to from here that have these same filters, and have one additional filter set.
It's a bit tricky to explain, but I'm looking for a result set that INCLUDES pages with other filters set, but NOT pages with a different value for the same filter ID.
So in the example, we want all pages that have filter 1 set to value 2, AND filter 7 set to 57. We also want pages with other filters (besides 1 and 7) assigned, but NOT pages who have filter 7 set to a value other than 57, and NOT pages who have filter 1 set to a value other than 2.
UPDATE with SAMPLE DATA
Pages_Filters:
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
In this case I should be able to ask, "What pages have Filter 2 set to 5, also have filter 7 set to 57, and also have filter 9 set to 141"?
The answer should be "only 297".
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
您应该能够“合并”结果集 union UNION/UNION ALL< /a>
类似的东西
You should be able to "merge" the result sets union UNION/UNION ALL
Something like
经过思考和阅读 Insane 的评论后,我意识到这可能就是您想要的。基本上,我创建的派生表创建了上面两个查询的交集。
After thinking and reading Insane's comments I realized that this is maybe what you want. Basically the Derived Table I have created creates the intersection of your two queries above.
试试这个
或者你可以尝试类似
http ://dev.mysql.com/doc/refman/5.0/en/exists-and-not-exists-subqueries.html
此链接中的
Try This
Or you can try something like
http://dev.mysql.com/doc/refman/5.0/en/exists-and-not-exists-subqueries.html
from this link
隔离生成 PageID 列表的查询。您最终需要一个返回所需值的查询。你可以这样做:
Isolate the query that produces your list of PageIDs. You need to end up with a single query that returns the values you need. You can do that like this: