自从我完成任何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’)
提前致谢。
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