我有NOT LIKE语句的问题。我有两个sql表设置为标记映射。第一个表根据搜索名称查找tag_id,第二个表根据找到的tag_id查找resource_id。当我在下面运行NOT LIKE语句时,我收到结果: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。
如果我的解释不清楚,请告诉我。
答案 0 :(得分: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%');
您查找名为“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;
答案 1 :(得分:1)
我不确定我是否理解您对查询结果的期望,但据我所知,这可能会对您有所帮助:
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