【问题标题】:multiple AND on same joined table coulmnn在同一联接表列上进行多个 AND
【发布时间】:2012-03-11 13:31:47
【问题描述】:

我有三个表格图像,image_tags 和 tags。 image 表包含图片信息,tags 包含标签信息,image_tags 包含图片和标签之间的关系,关系是多对多的。我想根据带有 AND 条件(不是 IN)的多个标签过滤图像。

我试过了:

SELECT images.* FROM images
LEFT JOIN image_tags ON image_tags.image_id = images.id 
LEFT JOIN tags tag_0 ON image_tags.tag_id = tag_0.id
LEFT JOIN tags tag_1 ON image_tags.tag_id = tag_1.id
WHERE tag_0.tag = "tagme"
AND tag_1.tag = "excellent"
AND images.filesize > 0
GROUP BY images.id
ORDER BY images.posted DESC LIMIT 0, 40

SELECT images.* FROM images
LEFT JOIN image_tags ON image_tags.image_id = images.id 
LEFT JOIN tags ON image_tags.tag_id = tags.id
WHERE tags.tag = "tagme"
AND tags.tag = "excellent"
AND images.filesize > 0
GROUP BY images.id
ORDER BY images.posted DESC LIMIT 0, 40

但是没有任何效果,尽管它们存在,但它总是返回零结果。

【问题讨论】:

    标签: mysql sql select left-join


    【解决方案1】:

    您的第一个查询,即使它使用LEFT 连接,也需要在“tagme”“excellent”上都命中tags,因为条件位于 where 子句中。将条件移到ON 子句中,如下所示:

    SELECT images.* FROM images
    LEFT JOIN image_tags ON image_tags.image_id = images.id 
    LEFT JOIN tags tag_0 ON image_tags.tag_id = tag_0.id AND tag_0.tag = 'tagme'
    LEFT JOIN tags tag_1 ON image_tags.tag_id = tag_1.id AND tag_1.tag = 'excellent'
    WHERE images.filesize > 0
    GROUP BY images.id
    ORDER BY images.posted DESC LIMIT 0, 40
    


    您的第二个查询离题了 - 它有一个不可能的条件:

    WHERE tags.tag = "tagme"
    AND tags.tag = "excellent"
    

    tags.tag 不能同时“tagme”“优秀”。

    【讨论】:

    • 感谢您如此快速的回复,但这会返回所有结果而无需任何过滤器。有什么想法吗?
    【解决方案2】:

    您的尝试都不够正确,尽管第一个尝试更接近正确的尝试。要按照您尝试过滤它们的方式过滤标签,您需要加入image_tags 两次,并将tags 的两个实例加入到image_tags 的单独实例中。似乎您想要进行内部联接而不是外部联接。这里:

    SELECT i.*
    FROM images i
      INNER JOIN image_tags it0 ON it0.image_id = i.id
        INNER JOIN tags t0 ON t0.id = it0.tag_id
      INNER JOIN image_tags it1 ON it1.image_id = i.id
        INNER JOIN tags t1 ON t1.id = it1.tag_id
    WHERE i.filesize > 0
      AND t0.tag = 'tagme'
      AND t1.tag = 'excellent'
    ORDER BY i.posted DESC
    LIMIT 0, 40
    

    还有另一种方法可以做到这一点。请尝试以下操作:

    SELECT i.*
    FROM images i
      INNER JOIN image_tags it ON it.image_id = i.id
        INNER JOIN tags t ON t.id = it.tag_id
    WHERE i.filesize > 0
      AND t.tag IN ('tagme', 'excellent')
    GROUP BY i.id
    HAVING COUNT(DISTINCT i.tag) = 2
    ORDER BY i.posted DESC
    LIMIT 0, 40
    

    t.tag IN ('tagme', 'excellent') 条件将允许的标签限制在指定的列表中,HAVING COUNT(DISTINCT i.tag) = 2 确保图像包含所有标签。

    【讨论】:

      猜你喜欢
      • 2013-06-23
      • 1970-01-01
      • 2021-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 2013-07-10
      • 2014-03-01
      相关资源
      最近更新 更多