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

Php 如果在联接查询中没有B值,则获取具有值的项(重复项),php,mysql,sql,normalization,Php,Mysql,Sql,Normalization,如果标题不清楚,很抱歉 我有这些桌子: image : id , title image_tags : image_id , tag image_categories : image_id , category_id 在图像页面中,我希望通过标签从同一类别中获得类似的图像,但我希望排除某些类别 下面是我的问题:(假设我的curernt图像有类别:1,标签:a,b,我想忽略类别:6,7) 这很有效,但如果我有 image_tags ( image_id , tag ) :

如果标题不清楚,很抱歉

我有这些桌子:

image : id , title 
image_tags : image_id , tag 
image_categories  : image_id , category_id 
在图像页面中,我希望通过标签从同一类别中获得类似的图像,但我希望排除某些类别

下面是我的问题:(假设我的curernt图像有
类别:1,标签:a,b
,我想忽略
类别:6,7

这很有效,但如果我有

       image_tags ( image_id , tag ) : 
        `128` , `a`
    --------------------------------------------
        image_categories (image_id , category_id ) :
        `128` , `1`
        `128` , `6`
由于
image\u类别中的第一行,我将获得id=128的图像

我必须以某种方式检查并忽略图像
128
becuz if第二行(
category_i:6


希望我的问题不会太混乱

image\u id
分组,并在
HAVING
子句中使用合适的聚合函数测试类别:

选择图像\u id
从图像\标记使用(图像\ id)连接图像\类别
其中image_tags.tag位于('a','b')中
按图像分组\u id
具有总和(第(1)项中的image_categories.category_id)
和不求和(在(6,7)中的image_categories.category_id)

我想
sum
是用来增加价值的(我得说,我从来没有见过像这样使用它)@max:是的。然而,MySQL没有真正的布尔值-它使用
1
表示true,使用
0
表示false。因此,如果表达式对于整个组为假,则将这些表达式的总和取在一组上将产生
0
;如果组中的任何记录为真,则为非零。@max:在其他RDBMS中,必须更加明确-例如
SUM(当(1)中的image\u categories.category\u id然后是1 ELSE 0 END时的情况)>0
@max
SUM
max
可用于表示“any”,而
MIN
可用于表示“none”。thanx,如果我只想排除6,7类(获取除这两个之外的所有类),该怎么办?如果我删除带有SUM的
(第(1)项中的image\u categories.category\u id))
       image_tags ( image_id , tag ) : 
        `128` , `a`
    --------------------------------------------
        image_categories (image_id , category_id ) :
        `128` , `1`
        `128` , `6`