如何添加行值并在添加后获取唯一行

时间:2011-02-21 15:20:31

标签: stored-procedures coldfusion cfquery

我正在使用Coldfusion,为我的公司进行网站搜索。我在cfc中调用了一个存储过程,它返回关键字的所有结果,没有限制。

然后我做一个子查询,根据安全设置限制我有权访问的数据,或者根据我将结果过滤到5个数据子集中的1个来限制它。

现在我们使用视图搜索数据库,该视图是一个union all查询,允许我一次搜索多个表,结果返回“id,type,title,url,rank”列。对于如何找到这个特定结果的不同等级值,最终得到具有不同等级值的重复结果....

现在我的老板,要我加上所有等级值,更新1条记录,并删除其余的重复...

例如,如果我正在寻找商业词汇

我有不同的结果,例如,在标题中找到,+ 500,完全匹配标题+1000,在说明中找到+200

但问题是,当我试图通过所有结果循环时,它增加了显着的性能消耗。

所以我正在寻找另一种方法来总结排名值,然后摆脱结果。

以下是整个过程的基本逻辑流程

  1. 搜索视图中存储关键字的存储过程,以不同方式搜索不同字段,生成具有不同排名值的重复结果。

  2. 取消那些我无权访问的搜索结果,如果我选择将结果过滤到某个结果子集中,例如书籍,杂货,植物,则组成您喜欢的任何类别:)

  3. 在这里,我将向您展示代码:

      <cfloop query="get_matches">
    
            <!--- check if this already exists --->
            <cfquery name="check_match" dbtype="query">
                select id, sum(rank) as total
                from get_matches
                where url = '#get_matches.url#'
                group by id
            </cfquery>
    
            <cfif check_match.total gt 1>
    
                <!--- add the two rank values --->
                <cfset my_rank = val(check_match.total) />
    
                <!--- update the search results --->
                <cfset get_matches.rank[get_matches.currentrow] = javacast("int",my_rank) />
    
                <!--- get a list of rows that has that url --->
    
                <!--- eliminate all other rows --->
                <cfquery name="get_matches_bot" dbtype="query">
                    select id, type, title, url, rank
                    from get_matches
                    where url <> '#get_matches.url#'
                    group by id, type, title, url, rank
                </cfquery>
    
                <cfquery name="get_matches_top" dbtype="query">
                    select id, type, title, url, rank
                    from get_matches
                    where url = '#get_matches.url#'
                    and rank = #my_rank#
                    group by id, type, title, url, rank
                </cfquery>
    
                <cfquery name="get_matches" dbtype="query">
                    select id, type, title, url, rank
                    from get_matches_top
                    union
                    select id, type, title, url, rank
                    from get_matches_bot
                    group by id, type, title, url, rank
                    order by rank desc, title asc
                </cfquery>
    
    
            </cfif>
    
        </cfloop>
    

    然后,完成所有这些操作后,可以帮助我们获得具有排名值总数的唯一行,以获得他们在#2结果中记录的位置。

        <cfquery name="get_matches" dbtype="query">
            select id, type, title, url, rank
            from get_matches
            group by id, type, title, url, rank
            order by rank desc, title asc
        </cfquery>
    

    必须有一种更好的方法,性能明智,总结排名值,摆脱重复行而不循环。

    有任何想法或建议吗?

1 个答案:

答案 0 :(得分:0)

我想出答案是在排名领域做一笔总和,这让它变得快。