簡體   English   中英

MySQL:在多個子查詢中使用“In”?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM