回答

收藏

多对多SQL查询用于选择所有带有某些单词标记的图像

技术问答 技术问答 279 人阅读 | 0 人回复 | 2023-09-14

我在Postgres中有2个表:  C5 x# L' X% q! a, S" N& A  O4 n
CREATE TABLE "images"  "id" serial NOT NULL PRIMARY KEY,   "title" varchar(300) NOT NULL,   "relative_url" varchar(500) NOT NULL)和
5 }& P. X1 a5 l1 o& TCREATE TABLE "tags"  "id" serial NOT NULL PRIMARY KEY,   "name" varchar(50) NOT NULL)为了在图像和标签之间建立多对多的关系,我有另一张表:; V$ ^2 l1 d, S# D
CREATE TABLE "tags_image_relations"  "id" serial NOT NULL PRIMARY KEY,   "tag_id" integer NOT NULL REFERENCES "tags" ("id") DEFERRABLE INITIALLY DEFERRED,   "image_id" integer NOT NULL REFERENCES "images" ("id") DEFERRABLE INITIALLY DEFERRED)现在,我必须写一个查询,比如 选择所有标记有’apple’和’microsoft’和’google’的图像的relative_url    ”1 o9 U3 {- s, H3 q! S3 q: l
对此,最优化的查询是什么?
' A& H# X, @% b' K/ L3 V9 P                                                                ( D. x! r5 Z1 P' C
    解决方案:                                                               
; E& O6 P5 c% M                                                                这是我写的工作查询:
0 \4 ^2 H+ L0 Q+ e5 ISELECT i.id,i.relative_url,count(*) as number_of_tags_matchedFROM   images i    join tags_image_relations ti on i.id = ti.image_id    join tags t on t.id = ti.tag_id    where t.name in ('google','microsoft','apple    group by i.id having count(i.id) 本查询将首先显示与所有三个标签相匹配的图像,然后在三个标签中至少匹配两个图像,最后匹配一个标签。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则