我有一张图片表和另一张图片标签表。
我正在尝试编写一个sql查询,它将获得每个图像id的有效标记数。
我最初的尝试是:
SELECT b.ID AS ID, COUNT(a.ID) AS NUM
FROM tbl_tags a, tbl_images b
WHERE (
b.ID = a.IMG_ID AND
(a.TAG_NAME LIKE '%scenic%' OR
a.TAG_NAME LIKE '%fruit%' OR
a.TAG_NAME LIKE '%bench%' OR
a.TAG_NAME LIKE '%bird%'
)
);
结果是:
ID NUM
7 13
但是,我想要的是显示找到的每个图像id的标记的计数值。我要找的是更像这样的东西:
ID NUM
3 2 -- Image ID #3 has 2 tags that match the query
68 1 -- Image ID #68 has 1 tag that matches the query
87 3 -- ...
92 2 -- ...
187 1 -- ...
875 2 -- ...
4条答案
按热度按时间wxclj1h51#
你不需要一个
join
因为图像id在tbl_tags
:我强烈建议您对表名使用缩写(例如
t
为了tbl_tags
)而不是武断的信件。它使查询更容易理解。pxiryf3j2#
这里有一个使用
REGEXP
它可以清理WHERE
有一点:bfhwhh0e3#
喜欢新的(从90年代开始!)联接语法
因为它更清楚。
使用聚合时分组使用
GROUP BY
```SELECT a.IMG_ID AS ID, COUNT(a.ID) AS NUM
FROM tbl_tags a
WHERE a.TAG_NAME LIKE '%scenic%'
OR a.TAG_NAME LIKE '%fruit%'
OR a.TAG_NAME LIKE '%bench%'
OR a.TAG_NAME LIKE '%bird%'
GROUP BY a.IMG_ID
zpf6vheq4#