2

私はこのクエリを使用しようとしています:

SELECT COUNT(PF.PageID) AS Total,P.PageID
FROM ページ P
LEFT JOIN Pages_Filters PF ON PF.PageID=P.PageID
WHERE P.PageID IN (
    (ページIDを選択
       FROM Pages_Filters
       WHERE フィルター ID="1"
       AND FilterOptionID="2"
    )、
    (ページIDを選択
       FROM Pages_Filters
       WHERE フィルター ID="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 番目のサブクエリが 2,3,4 を返す場合、"in" 句は次のようになります。

WHERE P.PageID IN (2,4)

2 と 4 は、2 つのサブクエリに共通する値であるためです。

これは1つのクエリで可能ですか?

アップデート:

質問をもう少し明確にしようと思います。

結果は、指定されたフィルターが特定の値に設定されているすべてのページを返す必要があります。これには、クエリの一部ではない追加のフィルターが設定されているページが含まれます。言い換えれば、特定のフィルターが配置されたページにいて、ここから移動できるすべてのページで同じフィルターがあり、さらに 1 つのフィルター セットが追加されているページを表示します。

説明するのは少し難しいですが、同じフィルター ID に対して異なる値を持つページではなく、他のフィルター セットを持つページを含む結果セットを探しています。

したがって、この例では、フィルター 1 が値 2 に設定され、フィルター 7 が 57 に設定されているすべてのページが必要です。また、他のフィルター (1 と 7 以外) が割り当てられているページも必要ですが、フィルター 7 が値 2 に設定されているページは必要ありません。 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

ページ:

ページID ページ名
297 いくつかのページ
305 別のページ
101 愚かなページ

この場合、「フィルター 2 が 5 に設定され、フィルター 7 が 57 に設定され、フィルター 9 が 141 に設定されているページはどれか」と尋ねることができるはずです。

答えは「297のみ」のはずです。

4

4 に答える 4

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 のコメントを考えて読んだ後、私はこれがおそらくあなたが望むものであることに気付きました. 基本的に、私が作成した派生テーブルは、上記の 2 つのクエリの交差を作成します。

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 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 に答える
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 に答える