1

私はこの形式のテーブルを持っています:

tag | item
----------
1   | 1
2   | 2
2   | 3
3   | 1
3   | 2
3   | 3

すべてのアイテムのセットに存在するタグを選択する必要があります。

例えば:

items={2,3} --> タグ{2,3}、アイテム 2 にはタグ 2,3、アイテム 3 にはタグ 2,3、共通タグは 2,3

items={1,2,3} --> タグ{}、アイテム 1 にはタグ 1、3、アイテム 2 にはタグ 2、3、アイテム 3 にはタグ 2、3、共通タグは 3

items={1,3} --> タグ{3}、アイテム 1 にはタグ 1、3、アイテム 3 にはタグ 2、3、共通タグは 3

入力として、アイテムのセットがあります。そのようなクエリの書き方がわかりません。

返信ありがとうございます。

4

2 に答える 2

1

同じタグを共有するアイテムのリストを探していると思いますよね?

このクエリはそれを行う必要があります。これは、各アイテムのタグをグループ化する内側のサマリー クエリと、タグ グループを共有するアイテムをグループ化する外側のサマリー クエリで構成されます。

SELECT GROUP_CONCAT(item ORDER by ITEM) items, tags
  FROM (
           SELECT GROUP_CONCAT(tag ORDER BY tag) tags, item
             FROM tbl
         GROUP BY item
        )t
  GROUP BY tags
  ORDER BY tags 

質問のテスト データセットに対して、次のように返されます。

| ITEMS | TAGS |
----------------
|     1 |  1,3 |
|   2,3 |  2,3 |

つまり、アイテム 1 にはタグ 1 と 3 があり、アイテム 2 と 3 にはタグ 2 と 3 があります。

フィドルに行く!http://sqlfiddle.com/#!2/6a927/3/0

于 2012-09-17T14:31:17.967 に答える
0

問題を解決するためのクエリは次のとおりです(タグとアイテムの重複エントリがないことを前提としています)

SELECT tag FROM <table_name>
WHERE item IN (<items to be searched seperated by ,>)
GROUP BY tag
HAVING COUNT(*) = <number of items>;

例: アイテム {1,3}

SELECT tag FROM <table_name>
WHERE item IN (1,3)
GROUP BY tag
HAVING COUNT(*) = 2;

アイテム {1,2,3} 用

SELECT tag FROM <table_name>
WHERE item IN (1,2,3)
GROUP BY tag
HAVING COUNT(*) = 3;

コンマで区切られた結果を表示するには、次のクエリを使用します

SELECT GROUP_CONCAT(a.tag) FROM (
SELECT tag FROM <table_name>
WHERE item IN (<items to be searched seperated by comma>)
GROUP BY tag
HAVING COUNT(*) = <no. of items>) AS a;

それが役に立てば幸い...

于 2012-09-17T14:04:41.073 に答える