Введение простого подзапроса для подсчета в уже существующий подзапрос - PullRequest
0 голосов
/ 08 февраля 2019

Я создаю простой браузер изображений, который подключен к базе данных SQLite.В браузере похожие изображения сгруппированы в событие , и каждое изображение помечено несколькими тегами .

Кто-то помог мне сконструировать этоочень полезный запрос ниже.В качестве примера он содержит 5 случайных тегов:

SELECT * 
FROM 
    (SELECT 
         t.EventId,
         SUM(CASE WHEN name = 'necktie' THEN 1 ELSE 0 END) as 'necktie',
         SUM(CASE WHEN name = 'shirt' THEN 1 ELSE 0 END) as 'shirt',
         SUM(CASE WHEN name = 'suit' THEN 1 ELSE 0 END) as 'suit',
         SUM(CASE WHEN name = 'man' THEN 1 ELSE 0 END) as 'man',
         SUM(CASE WHEN name = 'male' THEN 1 ELSE 0 END) as 'male' 
     FROM 
         TagsMSCV t 
     WHERE 
         name IN ('necktie', 'shirt', 'suit', 'man', 'male') 
     GROUP BY 
         t.EventId) 
ORDER BY 
    COUNT(*) DESC

Возвращает, сколько из каждого тега (столбца называется «имя») отображается в каждом событии.Однако теперь мне также нужен размер события (количество уникальных идентификаторов изображений в событии), который можно выполнить с помощью следующего запроса:

SELECT EventId, COUNT(DISTINCT ImageId) 
FROM TagsMSCV 
GROUP BY EventId 

Но я понятия не имею, как ввести этот синтаксис вподзапрос выше?Если я поставлю его рядом с t.EventId, он будет считать только идентификаторы изображения в случае, если они помечены 5 случайными тегами, что неверно.Мне нужно общее количество уникальных идентификаторов изображений в этом событии.

1 Ответ

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

Во-первых, ваш подзапрос не нужен.Во-вторых, вы можете использовать условные COUNT(DISTINCT):

SELECT t.EventId,
        SUM(CASE WHEN name = 'necktie' THEN 1 ELSE 0 END) as necktie,
        SUM(CASE WHEN name = 'shirt' THEN 1 ELSE 0 END) as shirt,
        SUM(CASE WHEN name = 'suit' THEN 1 ELSE 0 END) as suit,
        SUM(CASE WHEN name = 'man' THEN 1 ELSE 0 END) as man,
        SUM(CASE WHEN name = 'male' THEN 1 ELSE 0 END) as male 
        COUNT(DISTINCT CASE WHEN name = 'necktie' THEN imageid END) as necktie_images,
        COUNT(DISTINCT CASE WHEN name = 'shirt' THEN imageid END) as shirt_images,
        COUNT(DISTINCT CASE WHEN name = 'suit' THEN imageid END) as suit_images,
        COUNT(DISTINCT CASE WHEN name = 'man' THEN imageid END) as man_images,
        COUNT(DISTINCT CASE WHEN name = 'male' THEN imageid END) as male_images
FROM TagsMSCV t
WHERE name IN ('necktie', 'shirt', 'suit', 'man', 'male')
GROUP BY t.EventId 

РЕДАКТИРОВАТЬ:

Если вы хотите общее количество отдельных изображений для события, то условная логика не требуется.Просто используйте:

COUNT(DISTINCT imageid) as total_images,

и удалите предложение WHERE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...