我有一个表,其中包含一个列表的图像相关的标签。请在此屏幕截图中查看详细信息:
我尝试了:
SELECT a.* FROM wallpaper_tag as a, wallpaper_tag as b WHERE a.tag = 1 AND b.tag = 2 AND a.wallpaper = b.wallpaper ORDER BY wallpaper LIMIT 10000
这个SQL查询对我来说很好。但是有更好的选择吗?如果两个标签同时匹配,我想获得一个壁纸列表。
9rygscc11#
如果您实际需要的是所有wallpaper以及tag、1和2,则可以使用聚合来实现:
wallpaper
tag
1
2
SELECT wallpaper FROM wallpaper_tag WHERE tag IN (1, 2) GROUP BY wallpaper HAVING COUNT(DISTINCT tag) = 2 ORDER BY wallpaper LIMIT 10000
如果wallpaper和tag的组合是唯一的,则HAVING子句可以简化为仅:
HAVING
HAVING COUNT(*) = 2
fafcakar2#
我会使用显式连接:
SELECT a.* FROM wallpaper_tag as a INNER JOIN wallpaper_tag as b ON a.wallpaper = b.wallpaper WHERE a.tag = 1 AND b.tag = 2 ORDER BY a.wallpaper LIMIT 10000
我更喜欢这种语法,因为它使连接什么表以及如何连接这些表变得更清楚。
2条答案
按热度按时间9rygscc11#
如果您实际需要的是所有
wallpaper
以及tag
、1
和2
,则可以使用聚合来实现:如果
wallpaper
和tag
的组合是唯一的,则HAVING
子句可以简化为仅:fafcakar2#
我会使用显式连接:
我更喜欢这种语法,因为它使连接什么表以及如何连接这些表变得更清楚。