admin

基于标签的SQL查询

sql

自从我完成任何SQL以来已经有一段时间了,我不确定这个问题是否有一个简单的解决方案。我也有点菜鸟。

我正在尝试建立一个图库,以允许用户使用标签来搜索图像,然后单击其他标签来优化搜索并减少结果数量,但是所涉及的查询存在很大的问题。

这是我当前数据库结构的简化版本:

(2个表以及一个附加的多对多链接表)

CREATE TABLE images(
   image_id INT(12) AUTO_INCREMENT,
   image_name VARCHAR(128),
   PRIMARY KEY(image_id)
)ENGINE= INNODB;

CREATE TABLE tags(
   tag_name VARCHAR(64) NOT NULL,
   PRIMARY KEY(tag_name)
)ENGINE= INNODB;

CREATE TABLE images_tags_link(
   image_id_fk INT(12),
   tag_name_fk VARCHAR(64) NOT NULL,
   PRIMARY KEY(image_id_fk,tag_name_fk),
   FOREIGN KEY(image_id_fk) REFERENCES images(image_id),
   FOREIGN KEY(tag_name_fk) REFERENCES tags(tag_name)
)ENGINE= INNODB;

样本数据:

 ===images===
 ___________________________       
| image_id |  image_name    |     
|----------|----------------|     
|     1    |  image_001.jpg |     
|     2    |  image_002.jpg |     
|     3    |  image_003.png |     
|     4    |  image_004.jpg |     
|     5    |  image_005.gif |     
 ---------------------------                                     
 ===tags===                                 
 _______________
|    tag_name   |
|---------------|
| Landscape     |
| Portrait      |
| Illustration  |
| Photo         |
| Red           |
| Blue          |
| Character     |
| Structure     |
 ---------------
===images_tags_link===
 ________________________________
| image_id_fk | tag_name_ fk     |
|-------------|------------------|
|      1      |    Landscape     |
|      1      |    Illustration  |
|      1      |    Blue          |
|      2      |    Blue          |
|      2      |    structure     |
|      2      |    Landscape     |
|      3      |    Illustration  |
|      4      |    Red           |
|      4      |    Portrait      |
|      4      |    Character     |
|      5      |    Blue          |
|      5      |    Photo         |
 --------------------------------

我的问题是以下查询:

我正在寻找一个查询,该查询可以从IMAGES表中选择所有用户列出标签的所有“ image_names”,例如,一个用户可以搜索“ Blue”和“
Landscape”标签,这些标签仅应输出image_names“ image_001” .jpg”和“ image_002.jpg”。

===输入===

用户选择的标签:(’Blue’,’Landscape’)

===输出===

具有所有列出的标签的图像名称:(’image_001.jpg’,’image_002.jpg’)

提前致谢。


阅读 226

收藏
2021-06-07

共1个答案

admin

2种简单的方法来做到这一点。

根据所需的列,可能的标签数等,选择以下任意一种

SELECT *
FROM images
INNER JOIN images_tags_link a ON images.image_id = a.image_id_fk AND a.tag_name_fk = 'Blue'
INNER JOIN images_tags_link b ON images.image_id = b.image_id_fk AND b.tag_name_fk = 'Landscape'


SELECT images.image_id, images.image_name, COUNT(*) AS tag_count
FROM images
INNER JOIN images_tags_link a ON images.image_id = a.image_id_fk 
WHERE a.tag_name_fk IN ('Blue', 'Landscape')
GROUP BY images.image_id, images.image_name
HAVING tag_count = 2
2021-06-07