我正在制作一个连接到SQLite数据库的简单图像浏览器。在浏览器中,相似的图像被分组为一个事件,每个图像都带有一些标签。
要反映此信息,表(全部放在一个表中)的结构看起来像这样:
row_id tag image_id event_id
1 computer 201 1
2 desk 201 1
3 chair 201 1
4 computer 202 1
5 coffee 202 1
6 desk 202 1
7 dog 203 2
8 phone 203 2
etc. etc. etc. etc. // many 1000's
基本上,这个想法是用户可以搜索任意数量的标签(例如桌子,椅子和笔记本电脑),并获得事件ID的排名列表。每个事件都应该按照事件中包含所有标签,然后所有标签减1,然后所有标签减2等的图像数量进行排名。
目标是提出一个查询,该查询返回类似以下示例的信息,然后我可以对其进行排序。 (显然,行的长度将取决于要搜索的标签数量。)
event_id | event_size | no. imgs with 3 tags | no. imgs with 2 tags | no. imgs with 1 tag
2 74 6 24 55
5 20 2 4 14
3 36 4 11 22
这可能吗?事件的大小就是它包含的唯一图像ID的数量。其余的,我正在考虑使用...的组合...
SUM(CASE WHEN tag = 'computer' THEN 1 ELSE 0 END)
...可以实现吗?我是新来的,所以不确定这个问题有多难。
答案 0 :(得分:0)
您可以通过以下方式获取每个图像的匹配标签数:
select event_id, image_id, count(*) as num_matches
from t
where tag in ( . . . )
group by event_id, image_id;
这会过滤掉没有匹配标签的所有图像。因此,相反:
select event_id, image_id,
sum(case when tag in ( . . . ) then 1 else 0 end) as num_matches
from t
group by event_id, image_id;
然后您可以进行以下操作:
select event_id, count(*) as num_images,
sum(case when num_matches = 3 then 1 else 0 end) as num_3_tags,
sum(case when num_matches = 2 then 1 else 0 end) as num_2_tags,
sum(case when num_matches = 1 then 1 else 0 end) as num_1_tags
from (select event_id, image_id,
sum(case when tag in ( . . . ) then 1 else 0 end) as num_matches
from t
group by event_id, image_id
) t
group by event_id;