[英]MySQL: Using “In” with Multiple SubQueries?
我正在嘗試使用此查詢:
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是兩個子查詢共有的值。
一個查詢可以實現嗎?
更新:
我將嘗試更好地澄清這個問題。
結果應返回將指定過濾器設置為特定值的所有頁面INCLUDING設置了不屬於查詢的額外過濾器的頁面。 換句話說,我在一個包含某些過濾器的頁面上,向我顯示我可以從這里找到具有這些相同過濾器的所有頁面,並且還有一個額外的過濾器集。
解釋起來有點棘手,但我正在尋找一個結果集,其中包含其他過濾器設置的頁面,但不是同一過濾器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 PageName 297 Some Page 305 Another Page 101 A Stupid Page
在這種情況下,我應該能夠問:“過濾器2設置為5的哪些頁面,過濾器7設置為57,過濾器9設置為141”?
答案應該是“只有297”。
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
您應該能夠“合並”結果集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
嘗試這個
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
從這個鏈接
隔離生成您的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")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.