0

NOTLIKEステートメントに問題があります。タグマップとして2つのSQLテーブルを設定しています。最初のテーブルは検索名に従ってtag_idを検索し、2番目のテーブルは見つかったtag_idに基づいてresource_idを検索します。以下のNOTLIKEステートメントを実行すると、次の結果が得られます:resource_id=1。

マップテーブルにタグを付ける

tag_id name
1      meat
2      vegetarian

resource_id tag_id
1           1
1           2

クエリ

SELECT 
    f.id, f.food_name, tm.resource_id, tm.tag_id, t.name 
FROM 
    tag as t, tagmap as tm JOIN item as f ON 
    (
        f.id = tm.resource_id AND tm.tag_id IN 
        (
        SELECT 
            t.tag_id 
        FROM 
            tag as t 
        WHERE 
            t.name NOT LIKE '%meat%' 
        ) 
     )
GROUP by f.id

このクエリで必要なのは、タグ名が「meat」のresource_idが見つかった場合に、このresource_idを返さないようにすることだけです。

説明がはっきりしない場合はお知らせください。

4

2 に答える 2

1

次に、以下を検索する必要があります。

select resource_id
from tagmap
where resource_id not in (select resource_id
                          from tagmap
                          where tag_id in (select tag_id from tag
                                           where name like '%meat%'));

またはjoin

select *
from tagmap
where resource_id not in (select m.resource_id
                          from tagmap m, tag t
                          where m.tag_id = t.tag_id and t.name like '%meat%');

resource_id「肉」という名前で検索し、これらnot inを選択から除外します。

これはあなたの質問に対応しているかもしれませんが、私にはよくわかりません。

select f.id, f.food_name, tm.resource_id, tm.tag_id, t.name 
from tag as t, tagmap as tm, item as f
where f.id = tm.resource_id
      and tm.tag_id = t.tag_id
      and tm.resource_id not in (select m.resource_id
                                 from tagmap m, tag t
                                 where m.tag_id = t.tag_id
                                       and t.name like '%meat%')
group by f.id;
于 2012-10-27T21:02:10.037 に答える
1

クエリ結果に何が期待されるかは100%わかりませんが、理解していることから、これが役立つ可能性があります。

SELECT f.id, f.food_name, tm.resource_id, tm.tag_id, t.name 
FROM tag as t
left join tagmap as tm on tm.resource_id = t.tag_id
left join item as f on f.id = tm.resource_id
where t.name NOT LIKE '%meat%' 
GROUP by f.id

そして、クエリで遊ぶために、ここにsqlfiddleサンプルがあります:

http://sqlfiddle.com/#!2/561c4/7

編集:

したがって、選択したタグに添付されているリソースを除外する場合は、次のことを試してください。

SELECT f.id, f.food_name, tm.resource_id, tm.tag_id, t.name 
FROM tag AS t 
INNER JOIN tagmap AS tm ON tm.resource_id = t.tag_id 
INNER JOIN item AS f ON f.id = tm.resource_id 
where tm.resource_id not in (
  select resource_id from tagmap 
  where tag_id in (select tag_id from tag WHERE name LIKE '%meat%')
)  
GROUP by f.id

http://sqlfiddle.com/#!2/053fa/3

于 2012-10-27T21:11:21.297 に答える