尝试从数据库查询信息以获取简单的排名算法

时间:2019-02-06 12:30:39

标签: sql sqlite

我正在制作一个连接到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)

...可以实现吗?我是新来的,所以不确定这个问题有多难。

1 个答案:

答案 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;