如果在连接查询中没有B值,则获取具有A值的项目(重复项)

时间:2014-01-01 23:36:39

标签: php mysql sql normalization

抱歉,如果标题含糊不清。

我有这些表:

image : id , title 
image_tags : image_id , tag 
image_categories  : image_id , category_id 

在图片页面中,我想通过标签获得相似的图片,来自同一类别,但我想排除某些类别

所以这是我的问题:(假设我的治疗图片有category : 1 , tag : a,b,我想忽略category : 6,7

SELECT image_tags.image_id 
FROM   image_tags 
       JOIN image_categories 
         ON image_categories.image_id = image_tags.image_id 
WHERE  image_tags.tag IN ( 'a', 'b' ) && image_categories.category_id IN ( 1 ) 
       && 
              image_categories.category_id NOT IN ( 6, 7 ) 

有效,但如果我有

       image_tags ( image_id , tag ) : 
        `128` , `a`
    --------------------------------------------
        image_categories (image_id , category_id ) :
        `128` , `1`
        `128` , `6`

我会在id = 128

的第一行显示image_categories的图片

如果第二行(128

,我必须以某种方式检查并忽略图像category_i : 6 becuz

希望我的问题不是很混乱

1 个答案:

答案 0 :(得分:2)

image_id上分组并使用HAVING子句中合适的聚合函数测试类别:

SELECT   image_id
FROM     image_tags JOIN image_categories USING (image_id)
WHERE    image_tags.tag IN ('a','b')
GROUP BY image_id
HAVING   SUM(image_categories.category_id IN (1))
     AND NOT SUM(image_categories.category_id IN (6,7))