【问题标题】:How to select parent rows, whose children contain a set of subvalues?如何选择父行,其子行包含一组子值?
【发布时间】:2021-09-22 20:48:57
【问题描述】:

我需要从图像中选择行,其中属于图像的标记集至少包含字符串列表中指定的所有标记。

CREATE TABLE images (
                        image_checksum varchar(56) NOT NULL,
                        filename varchar(56),
                        PRIMARY KEY (image_checksum)
);

CREATE TABLE tags (
                      id int NOT NULL AUTO_INCREMENT,
                      name varchar(64),
                      confidence DECIMAL(5,2),
                      image varchar(56) NOT NULL,
                      PRIMARY KEY (id),
                      FOREIGN KEY (image) REFERENCES images(image_checksum)
);

我有这个查询,它返回所有带有标签的图像,这些标签包含列表中指定的任何对象。该列表将根据来自客户端的内容而变长。我在我的数据库中指定了两个图像。一只狗,一只猫。使用我需要的查询 - 我希望得到零结果,因为这两个图像都不包含狗和猫。

SELECT DISTINCT images.image_checksum, images.filename, tags.name, tags.confidence from images 
LEFT OUTER JOIN tags ON (tags.image = images.image_checksum)
WHERE name in ('dog','cat');

感谢任何帮助!

【问题讨论】:

  • IN 子句等于或,所以两者都使用 and
  • 我没关注,你能举个例子吗?

标签: mysql sql join


【解决方案1】:

您希望窗口函数计算匹配标签的数量。然后使用它进行过滤:

SELECT it.*
FROM (SELECT i.image_checksum, i.filename, t.name, tags.confidence ,
             COUNT(*) OVER (PARTITION BY i.image_checksum) as num_tags
      FROM images i JOIN
           tags t
           ON t.image = i.image_checksum
      WHERE t.name in ('dog', 'cat')
     ) it
WHERE num_tags = 2;

【讨论】:

    【解决方案2】:

    您可以使用 group_concat 来解决这个特定问题。

    SELECT images.image_checksum, images.filename, tags.name, 
           tags.confidence
      from images 
      LEFT OUTER JOIN tags ON (tags.image = images.image_checksum)
     WHERE tags.image in (select t1.image
                            from tags t1
                           group by t1.image
                          having group_concat(t1.name order by t1.name asc) like '%cat,dog%');
    

    这将返回具有这两个标签的所有图像,但也会返回与这些图像相关的所有标签。

    您只需要确保被搜索的标签是按字母顺序排列的,这样它就可以找到它们。

    group_concat 默认使用逗号作为不同值的分隔符。

    但是,可以使用关键字 SEPARATOR 覆盖它

    group_concat(tags.name SEPARATOR ', ')
    

    更多信息可以咨询here

    【讨论】:

      猜你喜欢
      • 2012-02-11
      • 1970-01-01
      • 1970-01-01
      • 2014-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-21
      • 1970-01-01
      相关资源
      最近更新 更多