Выберите элементы с несколькими тегами и выберите детали из других таблиц - PullRequest
0 голосов
/ 12 февраля 2019

Спасибо за отзыв на мой паршивый вопрос.Впервые здесь.

Я работаю с SQlite и C # в Visual Studio.

Это пример данных в моих таблицах:

TABLE: VIDEOS
-------------
ID  VideoName             VideoStarID       VideoCostarID
--------------------------------------------------------------
1   Casablanca                23                 43
2   Maltese Falcon            23                156
3   Matrix                   234                312
4   Matrix Reloaded          234                312
5   Matrix Revolutions       234                312
6   Pompeii                  312

TABLE: STARS
-------------
ID  StarName        
------------------------------
23  Humphrey Bogart 
43  Ingrid Bergman
156 Mary Astor
234 Keanu Reeves
312 Carrie-Anne Moss

TABLE: TAGS
-------------
ID  TagName     
------------------------------
1   Action
2   Classic
3   Drama
4   Horror
5   Thriller
6   Sci-Fi
7   Romance
8   Western
9   War
10  Film Noir
11  Comedy
12  History
13  Dystopia

TABLE: VIDEO_TAGS
-------------
VideoID     TagID   
------------------------------
1            2
1            5
1            7
1            9
2            1
2            2
2            5
3            1
3            5
3            6
3            13
4            1
4            5
4            6
4            13
5            1
5            5
5            6
5            13
6            12
6            3

Iхотел бы выбрать все фильмы с участием Кэрри-Энн Мосс и Киану Ривза с тегами «Боевик», «Научная фантастика» и «Триллер».На самом деле, мой запрос будет более сложным, чем в будущем, так как я должен иметь возможность включать параметры для года, студии, номинаций Оскар, побед Оскаров, рейтинга и т. Д .;но сейчас проблема в том, что я не могу получить вывод, подобный этому:

-----------------------------------------------------------------------------------------------------
|VideoID |      VideoName    |   StarName   |    CostarName    |         Tags                       |
-----------------------------------------------------------------------------------------------------
|   3    |Matrix             | Keanu Reeves | Carrie-Anne Moss | Action, Sci-Fi, Thriller, Dystopia |
|   4    |Matrix Reloaded    | Keanu Reeves | Carrie-Anne Moss | Action, Sci-Fi, Thriller, Dystopia |
|   4    |Matrix Revolutions | Keanu Reeves | Carrie-Anne Moss | Action, Sci-Fi, Thriller, Dystopia |
-----------------------------------------------------------------------------------------------------

Я попытался (очевидно) ошибочный запрос:

SELECT VIDEOS.ID, VIDEOS.VideoName, VIDEOS.StarID, VIDEOS.CostarID, STARS.StarName, GROUP_CONCAT(TAGS.Name) AS Tags
FROM VIDEOS
INNER JOIN STARS ON VIDEOS.StarID = STARS.ID
INNER JOIN VIDEO_TAGS ON VIDEOS.ID = VIDEO_TAGS.VideoID
INNER JOIN TAGS ON TAGS.ID = VIDEO_TAGS.TagID
WHERE 
VIDEOS.StarID = 234 AND 
VIDEOS.CostarID = 312 AND
VIDEO_TAGS = 1 AND
VIDEO_TAGS = 5 AND
VIDEO_TAGS = 6

Результат простоодин рядОн не получает все фильмы.Я также не получаю теги так, как хочу.

Надеюсь, эта информация поможет.Любая помощь будет очень признателен.

Заранее спасибо.

Ответы [ 2 ]

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

Вы получаете только 1 строку, потому что вам не хватает GROUP BY.Также вам нужно использовать IN для 3 TAGS.

SELECT VIDEOS.ID, VIDEOS.VideoName, VIDEOS.StarID, VIDEOS.CostarID, STARS.StarName, GROUP_CONCAT(TAGS.TagName) AS Tags
FROM VIDEOS
INNER JOIN STARS ON VIDEOS.StarID = STARS.ID
INNER JOIN VIDEO_TAGS ON VIDEOS.ID = VIDEO_TAGS.VideoID
INNER JOIN TAGS ON TAGS.ID = VIDEO_TAGS.TagID
WHERE 
VIDEOS.StarID = 234 AND 
VIDEOS.CostarID = 312 AND
VIDEO_TAGS.TagID IN (1,5,6)
GROUP BY VIDEOS.ID

DBFiddle здесь

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

Что вам не хватает, так это подзапрос:

  select distinct vt.videoid from video_tags vt
  where (select count(distinct tagid) from video_tags where videoid = vt.videoid and tagid in (1, 5, 6)) = 3

, который дает вам идентификаторы видео, которые имеют все 3 тега, которые вам нужны.Так что используйте это:

select v.id VideoID, v.videoname VideoName, s1.starname StarName, s2.starname CoStarName,
  (select group_concat(tagname) from tags where id in (select tagid from video_tags where  videoid = v.id)) Tags 
from videos v inner join (
  select distinct vt.videoid from video_tags vt
  where (select count(distinct tagid) from video_tags where videoid = vt.videoid and tagid in (1, 5, 6)) = 3
) f
on f.videoid = v.id
inner join stars s1
on s1.id = v.videostarid
left join stars s2
on s2.id = v.videocostarid
where s1.id = 234 and s2.id = 312  

См. демо

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