不喜欢MySQL声明

时间:2012-10-27 20:55:54

标签: mysql select sql-like

我有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。

如果我的解释不清楚,请告诉我。

2 个答案:

答案 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

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