【发布时间】:2021-12-30 23:56:34
【问题描述】:
SQL 版本:MySQL 8.0 或 SQL Server
SQL 小提琴:https://www.db-fiddle.com/f/wcHeXkcynUiYP3qzryoYJ7/6
我有一张图片表和一张链接到这些图片的标签表。
================================== ===================================================
| tb_images | | tb_imagetags |
================================== ===================================================
| f_imageID | f_imagefilename | | f_imagetagID | f_imagetagimage | f_imagetagname |
---------------------------------- ---------------------------------------------------
| 1 | 1.jpg | | 10 | 1 | November |
| 2 | 2.jpg | | 11 | 1 | 2021 |
| 3 | 3.jpg | | 12 | 2 | November |
================================== | 13 | 2 | 2020 |
| 14 | 3 | December |
| 15 | 3 | 2020 |
===================================================
我希望能够将 (2) 个标签传递给查询,并让它只选择与两个标签匹配的图像。例如,我想传递 November 和 2021 并让它只返回 1.jpg。
如果我这样做:
SELECT f_imageID, f_imagefilename
FROM tb_images
LEFT JOIN tb_imagetags
ON f_imagetagimage = f_imageID
WHERE f_imagetagname = 'November'
OR f_imagetagname = '2021'
但是返回:
f_imageID f_imagefilename
================================
1 1.jpg
1 1.jpg
2 2.jpg
如何重写此查询以仅获取与两个标签都匹配的图像?
【问题讨论】:
-
作为一般建议,如果您要在 WHERE 子句中提及 y,那么执行 x left join y 是没有意义的,因为它会转换为内连接,除非您添加的谓词允许左连接过程创建的 NULL 以“生存”