Поисковый запрос, приоритет "упорядочить по"

Мне нужно реализовать простой поиск в небольшой таблице содержимого: идентификатор, имя, описание, содержимое. Результаты должны быть упорядочены по приоритетам

  1. название
  2. описание
  3. содержание

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

Что я сделал:

Я попытался создать временную таблицу со структурой, подобной таблице, которую я использую, но с другим приоритетом поля. для каждого поля, которое я использую для поиска, выполните insert select во временную таблицу

Пример:

  DECLARE @query NVARCHAR(255)


  CREATE TABLE #tbl_search
    (
      [id] INT NOT NULL ,
      [name] NVARCHAR(255) ,
      [description] NVARCHAR(MAX) ,
      [content] NVARCHAR(MAX) ,
      [priority] INT
    )    


    --searching in name field
  INSERT    INTO #tbl_search
            ( [ID] ,
              [name] ,
              [description] ,
              [content] ,
              [priority]

            )
            SELECT  [ID] ,
                    [name] ,
                    [description] ,
                    [content] ,
                    1
            FROM    [tbl_content]
            WHERE   name LIKE '%' + @query + '%'

    --searching in description field            
  INSERT    INTO #tbl_search
            ( [ID] ,
              [name] ,
              [description] ,
              [content] ,
              [priority]

            )
            SELECT  [ID] ,
                    [name] ,
                    [description] ,
                    [content] ,
                    2
            FROM    [tbl_content]
            WHERE   description LIKE '%' + @query + '%'
                    AND id NOT IN ( SELECT  id
                                    FROM    #tbl_search )
   --.....           

  SELECT    *
  FROM      #tbl_search
  ORDER BY  [priority]

  DROP TABLE #tbl_search

person Sasha    schedule 14.02.2010    source источник
comment
Значит, где-то есть вопрос?   -  person Guffa    schedule 14.02.2010
comment
Я думаю, он спрашивает, как бы ты это сделал..   -  person Amirshk    schedule 14.02.2010
comment
Am, да вы правы, это вопрос :)   -  person Sasha    schedule 14.02.2010


Ответы (3)


Один из способов сделать это — использовать ключевое слово CASE:

SELECT name, description, content,
    priority = CASE
        WHEN name LIKE '%' + @query + '%' THEN 1
        WHEN desription LIKE '%' + @query + '%'  THEN 2
        WHEN content LIKE '%' + @query + '%'  THEN 3
    END CASE
FROM tbl_content
WHERE
    name LIKE '%' + @query + '%' OR
    desription LIKE '%' + @query + '%'  OR
    content LIKE '%' + @query + '%'
ORDER BY priority ASC
person Amirshk    schedule 14.02.2010
comment
интересно, я не знал, что у меня есть возможность поиска в select - person Sasha; 14.02.2010
comment
@msony, теперь ты знаешь :) CASE очень мощный инструмент - person Amirshk; 14.02.2010

Самый простой способ - использовать запрос UNION:

SELECT name AS text FROM tbl_content WHERE name LIKE '%' + @query + '%'
UNION
SELECT description AS text FROM tbl_content WHERE desription LIKE '%' + @query + '%'
UNION
SELECT content AS text FROM tbl_content WHERE content LIKE '%' + @query + '%'
person Alex Shirshov    schedule 14.02.2010
comment
@msony Я считаю, что вы не получите дубликатов, если не используете UNION ALL. - person Asaf R; 14.02.2010
comment
он получит дубликаты, потому что запрос содержит только 1 столбец. @Alex, вам нужно добавить все 3 столбца в каждый запрос (и оставить условие как есть). - person Amirshk; 14.02.2010

Для полноты картины я переношу блестящее решение @Amirshk на следующий уровень, используя предложение case when in order (запрос для mysql):

SELECT name, description, content
FROM tbl_content
WHERE
    name LIKE '%' + @query + '%' OR
    desription LIKE '%' + @query + '%'  OR
    content LIKE '%' + @query + '%'
ORDER BY CASE
        WHEN name LIKE '%' + @query + '%' THEN 1
        WHEN desription LIKE '%' + @query + '%'  THEN 2
        WHEN content LIKE '%' + @query + '%'  THEN 3
    END
person hpaknia    schedule 20.08.2019