Je suis coincé dans une situation où je suis incapable de progresser. L'exigence est ci-dessous.
J'ai deux tables dont l'une est ContentTag
ContentId FolderId 48 2
Cela contient le lien entre la table de contenu et la table de balises
et il y a une table foldettag qui contient la liaison entre la table des dossiers et la table des balises
Id FolderId TagId 2 2 3 3 2 4 4 2 5 5 2 6 6 4 3 7 5 1 8 5 2 9 5 3 10 10 1
le dossier ne contiendra que les contenus liés à toutes les balises aimant le dossier.
Remarque: j'ai besoin du résultat qui contient le lien de ces contentId et FolderId qui sont liés exactement aux mêmes balises.
par exemple, il contiendra le résultat suivant
Id ContentId TagId 1 48 3 2 48 4 3 48 5 4 48 6 5 47 7 6 47 8 9 47 1 10 47 2
Quelqu'un peut-il me suggérer une approche que je devrais suivre pour procéder?
J'essaye de trouver une solution depuis quelques heures mais je ne trouve aucune solution Merci
3 Réponses :
Si vous voulez un résultat avec le dossier et tout le contenu qui a au moins une balise correspondante, alors join devrait suffire:
select ft.folderid, ct.contentid
from foldertags ft join
contenttag ct
on ft.tagid = ct.tagid
mais il donnera à toutes les données sa simple jointure. J'ai besoin de filtrer ce résultat afin qu'il ne contienne que les contentid qui sont liés exactement aux mêmes balises car le dossier est lié aux balises. J'essaierai d'élaborer un peu plus mon problème
Dans SQL Server 2017, vous pouvez utiliser STRING_AGG() :
> ContentId | FolderId > --------: | -------: > 48 | 2
Voir la démo .
Résultats:
WITH
c AS (
SELECT ContentId, STRING_AGG(TagId, ',') WITHIN GROUP (ORDER BY TagId) tags
FROM ContentTag
GROUP BY ContentId
),
f AS (
SELECT FolderId, STRING_AGG(TagId, ',') WITHIN GROUP (ORDER BY TagId) tags
FROM FolderTag
GROUP BY FolderId
)
SELECT c.ContentId, f.FolderId
FROM c INNER JOIN f
ON f.tags = c.tags
declare @ContentTag table
(
Id int identity,
ContentId int,
TagId int
);
insert into @ContentTag(ContentId, TagId)
values
(48, 3), (48, 4), (48, 5), (48, 6),
(47, 7), (47, 8), (47, 1), (47, 2),
(46, 4), (46, 6);
declare @FolderTag table
(
Id int identity,
FolderId int,
TagId int
);
insert into @FolderTag(FolderId, TagId)
values
(2, 3), (2, 4), (2, 5), (2, 6),
(4, 3), (5, 1), (5, 2), (5, 3), (10, 1),
(11, 4), (11, 6);
select f.FolderId, c.ContentId
from
(
select FolderId, TagId, count(*) over(partition by FolderId) as FolderTagCount
from @FolderTag
) as f
join
(
select ContentId , TagId, count(*) over(partition by ContentId) as ContentTagCount
from @ContentTag
) as c on f.TagId = c.TagId and f.FolderTagCount = c.ContentTagCount
group by f.FolderId, c.ContentId
having count(f.TagId) = max(c.ContentTagCount);
Comment savez-vous quelles balises sont appréciées? Quels résultats voulez-vous. La vraie question n'est pas claire.
HI @GordonLinoff, les balises sont liées au contenu et les dossiers sont également liés aux balises, donc j'ai besoin de lier le contenu au dossier et de le filtrer pour n'avoir que les contenus qui sont liés à toutes les balises
Quelle est votre version de SQL Server?
@forpas serveur sql 2016
@forpas Désolé son serveur SQL 2017, avez-vous quelque chose qui est pris en charge dans la nouvelle version