Как добавить значения строк и получить уникальные строки после их добавления - PullRequest
0 голосов
/ 21 февраля 2011

Я использую Coldfusion, чтобы выполнить поиск по сайту для моей компании. У меня есть хранимая процедура, вызываемая в cfc, которая возвращает все результаты для ключевого слова, без ограничений.

Затем я выполняю подзапрос, который либо ограничивает те данные, к которым у меня есть доступ, на основе настроек безопасности, либо ограничивает их на основе того, что я фильтрую результат до 1 из 5 подмножеств данных.

Теперь мы ищем базу данных, используя представление, и это представление представляет собой запрос на объединение всех, что позволяет мне выполнять поиск по нескольким таблицам одновременно, и результат возвращает столбцы «id, type, title, url, rank». С различными значениями ранга для того, как он нашел эти конкретные результаты, что в итоге приводит к дублированию результатов с разными значениями ранга ....

Теперь мой босс хочет, чтобы я сложил все значения рангов, обновил 1 запись и удалил остальные дубликаты ...

Так, например, если я искал слово "бизнес"

И у меня были разные результаты, такие как: найдено в заголовке, +500, точное совпадение для заголовка +1000, найдено в описании + 200

Но проблема в том, что когда я пытался выполнить цикл по всем результатам, это привело к значительному снижению производительности.

Поэтому я ищу альтернативный способ суммировать значения рангов, а затем избавиться от результатов.

Ниже приведен мой основной логический поток для всего процесса

  1. Do Stored Процедура, которая выполняет поиск по ключевому слову, выполняет поиск в разных полях по-разному, генерируя дублированные результаты с различными значениями ранга.

  2. Исключает результаты поиска из тех, к которым у меня нет доступа, и если я выбрал фильтрацию результатов в определенном подмножестве результатов, например, в книгах, продуктовых магазинах, растениях, составляйте любые категории, которые вам нравятся :)

Здесь я покажу вам код:

  <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 голосов
/ 02 марта 2011

Я понял, что ответом было сделать сумму вокруг поля ранга, и это сделало это быстрым.

...