gpt4 book ai didi

MySQL 选择与另一个实体共享共同关系的所有标签

转载 作者:行者123 更新时间:2023-11-29 11:45:37 25 4
gpt4 key购买 nike

我有以下表结构:

tags            image_tags          image
------------ ---------------- ---------------
id tag tag_id image_id id etc...
------------ ---------------- ---------------
1 apple 1 1 1 image_1.jpg
2 banana 2 1 2 image_2.jpg
3 cherry 2 2
3 2

标签通过多对多关系连接到图像。

我想获取至少在一张图像中一起出现的标签列表。类似于:

-----------------
a b
-----------------
apple banana
banana cherry

etc..

每个标签对只能出现一次,并且标签对的顺序无关紧要。我们将使用此数据为网络图创建 .dot 文件。

我不确定如何构建这样的查询。

最佳答案

如果我们每次只处理 2 列,则需要一个自连接和 2 个标签连接。然而,这将消除图像仅具有 1 个标签的所有记录。如果您需要这些,我们需要更改一些连接。

这将说明每个图像有 n 条记录,并且每个图像只有 1 个配对。例如。苹果、樱桃而不是樱桃苹果。它是通过匹配 IT.Tag_ID < IT2.Tag_ID 来完成的

SELECT Distinct T.tag A, T2.Tag B
FROM image_tags IT
INNER JOIN tags T
on T.ID = IT.Tag_Id
INNER JOIN Image_tags IT2
on IT2.image_ID = IT.Image_ID
and IT.Tag_ID < IT2.Tag_ID
INNER JOIN Tags T2
on IT2.tag_ID = T2.Tag_ID

根据您的数据,这将为您提供。

-----------------
a b
-----------------
apple banana
banana cherry

但是,如果您将标签添加到标签 3 的图像 1,那么您会得到

-----------------
a b
-----------------
apple banana
banana cherry
apple cherry

这是因为 2 的 3 个组合为 3。由于图像 2,香蕉樱桃将被列出两次,但不同的值消除了重复项。 < 使其成为一个组合,就好像我们没有使用任何东西一样,我们最终会得到一个排列。 (苹果香蕉)将被认为与(香蕉苹果)不同根据您的输出,我相信您正在寻找组合。

----------------------------------旧回复------------------------ ---

我不再相信您正在寻找 mySQL 中的聚合函数 group_concat()

这允许您将多行合并为一行。

Select group_Concat(T.tag ORDER BY t.tag SEPARATOR ',') as All_Image_Tags
FROM image_tags IT
INNER JOIN tags T
on T.ID = IT.Tag_Id
GROUP BY IT.image_ID

也许你只是在配对之后..

Select concat(A.Tags, ',', B.tags)
FROM tags a
cross join tags B
Where A.Tag < B.Tag

关于MySQL 选择与另一个实体共享共同关系的所有标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35000852/

25 4 0