Попытка запросить информацию из базы данных для простого алгоритма ранжирования - PullRequest
0 голосов
/ 06 февраля 2019

Я делаю простой браузер изображений, который подключен к базе данных 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

В принципе, идея заключается в том, что пользователь может искать любое количество тегов (например,письменный стол, стул и ноутбук) и получите обратно ранжированный список идентификаторов событий.Каждое событие должно быть ранжировано по количеству изображений в событии, содержащем все теги, затем все теги минус 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

Возможно ли это?Размер события - это просто количество уникальных идентификаторов изображений, которые оно содержит.В остальном, я думал, что с помощью некоторой комбинации ...

SUM(CASE WHEN tag = 'computer' THEN 1 ELSE 0 END)

... можно ли этого достичь?Я новичок в этом, поэтому не уверен, насколько это сложный вопрос.

1 Ответ

0 голосов
/ 06 февраля 2019

Вы можете получить количество подходящих тегов на изображение с помощью чего-то вроде этого:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...