【问题标题】:How to group news based on Tag, Categories , countries using MS SQL如何使用 MS SQL 根据标签、类别、国家对新闻进行分组
【发布时间】:2018-03-08 06:15:39
【问题描述】:

我有一个与新闻相关的表格,其中包含多个字段,例如Title, Category, Tag, Country, details ...

我需要根据用户现在正在阅读的新闻显示related news

相关新闻可以基于Tag, Category & Country

我面临的问题是Tags 我需要使用所有新闻项目搜索每个标签,例如,如果新闻项目有 3 个标签,那么它必须搜索所有新闻记录三次才能获得基于标签的结果匹配。

我在 Fiddle http://sqlfiddle.com/#!18/d9dd7/1 上设置了示例表结构

示例表

CREATE TABLE [TestTable](
    [AutoID] [int] IDENTITY(1,1) NOT NULL,
    [Title] [nvarchar](100) NULL,
    [Category] [nvarchar](50) NULL,
    [Tags] [nvarchar](200) NULL,
    Country [nvarchar](50)
) 

示例

假设我正在阅读This is News One America

然后相关文章应显示This is News five,因为它与类别和两个关键字“唐纳德特朗普,伊朗”匹配,但在这种情况下,国家不同,这有点困难

所以搜索应该优先基于

  1. 1 类
  2. 标签
  3. 国家

我正在使用的 SP

DECLARE @Category NVARCHAR(100);
DECLARE @Country NVARCHAR(100);
DECLARE @Tags NVARCHAR(4000);


    SELECT 
    ,@Category = 'Politics'
    ,@Country = 'US'
    ,@Tags = 'Donald Trump, Iran'
    FROM TestTable WHERE AutoID=1

    DECLARE @tempTable TABLE
    (
        TempNewsId INT IDENTITY(1,1),
        ID INT,
        Title NVARCHAR(MAX),
        Desc NVARCHAR(MAX),
        Tags NVARCHAR(100),
        Country NVARCHAR(50),
        Category NVARCHAR(100)
    )

    IF @Category IS NOT NULL
        BEGIN
            SET @Category ='%'+ @Category+'%'
            INSERT INTO @tempTable
            SELECT TOP 4
            AutoID, Title, Desc,Tags,Country,Category FROM TestTable 
            WHERE Category IS NOT NULL AND Category LIKE @Category
        END 

    IF @Tags IS NOT NULL
        BEGIN
            SET @Tags ='%'+ @Tags+'%'
            INSERT INTO @tempTable
            SELECT TOP 4
            AutoID, Title, Desc,Tags,Country,Category FROM TestTable 
            WHERE Tags IS NOT NULL AND Category LIKE @Tags
        END 




    IF @Country IS NOT NULL
        BEGIN
            SET @Country ='%'+ @Country+'%'
            INSERT INTO @tempTable
            SELECT TOP 4
            AutoID, Title, Desc,Tags,Country,Category FROM TestTable 
            WHERE Country IS NOT NULL AND Country LIKE @Country
        END 

    SELECT TOP 20 ID, Title,[Desc],Tags,Country,Category    FROM @tempTable 
    ORDER BY TempNewsId ASC

【问题讨论】:

  • 您能否给出一个具有预期输出的示例输入示例。
  • 研究使用全文搜索。顺便说一句,您从未向我们展示过您当前的查询,或者您遇到问题的原因。
  • @PawanKumar,我已经用一种可能的情况更新了问题
  • 桌子的大概尺寸是多少?
  • @gomory-chvatal,大约 330 行,它以缓慢的页面增长,每月最多 2-4 条新闻

标签: sql sql-server tsql sql-server-2012


【解决方案1】:

性能不会很好,但你可以创建一个标量函数来比较标签列表并返回相似标签的数量。

create FUNCTION dbo.CompareTags
(
    @inputTagList1 varchar(255),
    @inputTagList2 varchar(255),
    @SplitOn varchar(5) = ','
)
RETURNS int
BEGIN

    declare @tagList1 table (Tag varchar(100));
    declare @tagList2 table (Tag varchar(100));

    -- populate table with first list of tags
    DECLARE @split_on_len INT = LEN(@SplitOn)
    DECLARE @start_at INT = 1
    DECLARE @end_at INT
    DECLARE @data_len INT
    WHILE 1=1
    BEGIN
        SET @end_at = CHARINDEX(@SplitOn,@inputTagList1,@start_at)
        SET @data_len = CASE @end_at WHEN 0 THEN LEN(@inputTagList1) ELSE @end_at-@start_at END
        INSERT INTO @tagList1 (Tag) VALUES( lower(rtrim(ltrim(SUBSTRING(@inputTagList1,@start_at,@data_len)))) );
        IF @end_at = 0 BREAK;
        SET @start_at = @end_at + @split_on_len
    END

    -- populate table with second list of tags
    set @start_at = 1
    WHILE 1=1
    BEGIN
        SET @end_at = CHARINDEX(@SplitOn,@inputTagList2,@start_at)
        SET @data_len = CASE @end_at WHEN 0 THEN LEN(@inputTagList2) ELSE @end_at-@start_at END
        INSERT INTO @tagList2 (Tag) VALUES( lower(rtrim(ltrim(SUBSTRING(@inputTagList2,@start_at,@data_len)))) );
        IF @end_at = 0 BREAK;
        SET @start_at = @end_at + @split_on_len
    END


    -- compare tables
    RETURN (select count(*) from @tagList1 as a inner join @tagList2 as b on a.Tag = b.Tag)
END
go

【讨论】:

  • 我不确定性能是否会出现问题,我们将处理大约 300-400 行
  • 该函数将第一个标签列表转换为带有标签的表格,然后将第二个标签列表转换为带有标签的不同表格,然后返回匹配的行数.因此,select dbo.CompareTags('a, b', 'a, b, c', ',') 将返回 2,因为两个标签匹配。您可以在加入原始表格时使用此功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多