0

オブジェクト、タグ、および tag_relationships テーブルがあります。オブジェクトとタグにはそれぞれ id 列があり、tag_relationships は 2 つを接続します。

tag_relationships のサンプル (以下の例で使用):

+--------+--------+
| obj_id | tag_id |
+--------+--------+
| 1      | 1      |
| 1      | 2      |
| 2      | 1      |
| 2      | 3      |
| 2      | 4      |
+--------+--------+

AND 検索を実装して、人々がタグをフィルタリングできるようにしたいと考えています。指定されたすべての tag_id を持つ行を持つ obj_id のみが返されます。例えば:

サンプル入力: 1、3 (実際にはタグ名になりますが、ID に変換されます)

望ましい出力: 2

これは簡単なはずですが、私の人生では、これを行う簡単な方法がわかりません。現在、指定された tag_ids のいずれかを持つ tag_relationships のすべての行を含むテーブルを返し、PHP でそれらを並べ替えることを考えています。より単純な SQL のみの方法はありますか?

4

1 に答える 1

3

HAVINGこの句を と組み合わせて使用​​すると、何かすべてGROUP BYに関する質問に答えることができます...

SELECT
    obj_id
FROM
    tag_relationships
WHERE
    tag_id IN (1,3)
GROUP BY
    obj_id
HAVING
    COUNT(*) = 2

2は、COUNT(*)検索しているタグの数を表します。3 つのタグなどを満たすオブジェクトが必要な場合 (例: 1,3,6)、COUNT(*)まで3.

于 2012-06-22T01:55:03.183 に答える