我面临一个问题,即我的查询无法通过相关性排序,因为我声明'列'匹配并尝试按它排序。SQL Server 2008 - 联合4查询和按相关性排序
我试图创建一个使用UNION
存储过程。
此查询有一些我需要遵循的规则,因为我需要带3条相关文章。每条规则都有一条查询,我试图将它们联合起来。
让我解释一下这些规则:
- 我需要搜索和匹配,并具有与之相关的同一个项目里面相同的标记物品(如
CampanhaId
) - 我需要搜索和匹配相同的标签,而不是同一个项目里面,但公共物品
- 在同一个项目中最近的文章
- 近期公共物品
我需要在priory中遵循这些规则,并搜索前三篇文章。
因此,如果第一条规则不具有至少3篇文章,第二条规则将尝试以填补它。第三条和第四条规则也采用相同的方式。
我试图创建这样的查询:
CREATE PROCEDURE [dbo].[SP_GetNoticiaRelacionada]
(@Tag VARCHAR(50), @ExtranetId INT, @CampanhaAreaId INT, @NoticiaId INT)
AS
BEGIN
SELECT TOP 3 *
FROM
(SELECT DISTINCT
ArtigoId, CategoriaId, Titulo, Conteudo,
Subtitulo, Categoria, FotoCompacta, QtdResposta,
0 AS MATCH, DataAlteracao
FROM
(SELECT
A.ArtigoId, A.CategoriaId, A.Titulo, A.Conteudo,
A.Subtitulo, C.Nome AS Categoria,
A.ImgAlt AS FotoCompacta,
(SELECT COUNT(*) FROM Comentario C
WHERE C.GenericAreaId = A.ArtigoId) AS QtdResposta,
1 AS MATCH, A.DataAlteracao
FROM
Artigo A
JOIN
ArtigoCategoria C ON A.CategoriaId = C.CategoriaId
WHERE
A.Apagado = 0
AND A.TAG COLLATE Latin1_General_CI_AI LIKE '%' + @Tag + '%'
AND A.CampanhaAreaId = @CampanhaAreaId
AND A.ArtigoId <> @NoticiaId
UNION
SELECT A.ArtigoId
,A.CategoriaId
,A.Titulo
,A.Conteudo
,A.Subtitulo
,C.Nome AS Categoria
,A.ImgAlt AS FotoCompacta
,(SELECT COUNT(*) FROM Comentario C WHERE C.GenericAreaId = A.ArtigoId) AS QtdResposta
,2 AS MATCH
,A.DataAlteracao
FROM Artigo A
JOIN ArtigoCategoria C ON A.CategoriaId = C.CategoriaId
WHERE A.Apagado = 0 AND A.TAG COLLATE Latin1_General_CI_AI LIKE '%' + @Tag + '%' AND A.CampanhaId = @ExtranetId AND A.ArtigoId <> @NoticiaId
UNION
SELECT A.ArtigoId
,A.CategoriaId
,A.Titulo
,A.Conteudo
,A.Subtitulo
,C.Nome AS Categoria
,A.ImgAlt AS FotoCompacta
,(SELECT COUNT(*) FROM Comentario C WHERE C.GenericAreaId = A.ArtigoId) AS QtdResposta
,3 AS MATCH
,A.DataAlteracao
FROM Artigo A
JOIN ArtigoCategoria C ON A.CategoriaId = C.CategoriaId
WHERE A.Apagado = 0 AND A.CampanhaAreaId = @CampanhaAreaId AND A.ArtigoId <> @NoticiaId
UNION
SELECT A.ArtigoId
,A.CategoriaId
,A.Titulo
,A.Conteudo
,A.Subtitulo
,C.Nome AS Categoria
,A.ImgAlt AS FotoCompacta
,(SELECT COUNT(*) FROM Comentario C WHERE C.GenericAreaId = A.ArtigoId) AS QtdResposta
,4 AS MATCH
,A.DataAlteracao
FROM Artigo A
JOIN ArtigoCategoria C ON A.CategoriaId = C.CategoriaId
WHERE A.Apagado = 0 AND A.CampanhaId = @ExtranetId AND A.ArtigoId <> @NoticiaId
) AS T
GROUP BY
ArtigoId
,CategoriaId
,Titulo
,Conteudo
,Subtitulo
,Categoria
,FotoCompacta
,QtdResposta
,MATCH
,DataAlteracao) AS T2
ORDER BY T2.MATCH ASC, T2.DataAlteracao DESC
END
所以,第一个查询只返回在相同的代码和项目文章。
第二个,返回与匹配相同TAG的所有文章。
第三个,匹配同一个项目中的所有文章。
最后一个匹配所有文章发布。
我真正的问题,我想,所有的结果都不尊重那个顺序。
如果我有同一个标签的两篇文章,这应该首先带来的相关文章,但不知何故,这首先使我最近更新的,不应该在列表中的第一个任何物品。
当我试图执行此过程时,SQL Server始终返回值为0
的列Match
。
我认为这个问题出现在这个匹配列中,我不能按它排序。
如果有人需要更多信息,请告诉我。我将不胜感激任何帮助。
我没有任何进一步的行动,我需要采取。
它是一个SQL查询语句,不POG的编程...笑 – bcesars