多对多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) 本查询将首先显示与所有三个标签相匹配的图像,然后在三个标签中至少匹配两个图像,最后匹配一个标签。 |
|
|
|
|
|