Можно ли построить следующий запрос SQL - PullRequest
4 голосов
/ 20 сентября 2008

Исходный запрос выглядит так (MySQL):

SELECT * 
FROM books 
WHERE title LIKE "%text%" OR description LIKE "%text%" 
ORDER BY date

Можно ли переписать его (без союзов или процедур), чтобы результат выглядел так:

  • список книг, в которых заголовок соответствует запросу, упорядоченному по дате, затем:
  • список книг, где описание соответствует запросу, упорядоченному по дате

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

Ответы [ 7 ]

18 голосов
/ 20 сентября 2008

На сервере SQL я бы сделал следующее:

select * from books 
where title like '%text%' or description like '%text%'
order by case when title like '%text%' then 1 else 2 end, date

Я не уверен, что вы можете включить столбцы в ORDER BY в mysql, которых нет в SELECT, но я бы использовал этот принцип. В противном случае, просто включите производный столбец в SELECT.

3 голосов
/ 20 сентября 2008
select * from books 
where title like "%text%" or description like "%text%" 
order by date, case when title like "%text%" then 0 else 1 end
2 голосов
/ 20 сентября 2008

Предложение RJK - правильный путь. Имейте в виду, однако, что этот запрос (с объединением или без него) не может использовать индексы, поэтому он не будет хорошо масштабироваться. Возможно, вы захотите проверить полнотекстовую индексацию MySQL, которая лучше масштабируется, позволяет выполнять более сложные запросы и даже помогает с ранжированием результатов.

0 голосов
/ 20 сентября 2008
DECLARE @Books TABLE
(
    [ID] INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
    [Title] NVARCHAR(MAX) NOT NULL,
    [Description] NVARCHAR(MAX) NOT NULL,
    [Date] DATETIME NOT NULL
)

INSERT INTO @Books
SELECT 'War and Peace','A Russian Epic','2008-01-01' UNION
SELECT 'Dogs of War','Mercenary Stories','2006-01-01' UNION
SELECT 'World At Arms','A Story of World War Two','2007-01-01' UNION
SELECT 'The B Team','Street Wars','2005-01-01' 

SELECT * FROM
(
    SELECT *, CASE WHEN [Title] LIKE '%war%' THEN 1 WHEN [Description] LIKE '%war%' THEN 2 END AS Ord
    FROM @Books
    WHERE [Title] LIKE '%war%' OR [Description] LIKE '%war%'
) AS Derived
ORDER BY Ord ASC, [Date] ASC

Полагаю, это дает вам то, что вы хотите, но из-за дополнительной нагрузки в производной статистике CASE она может не иметь хорошей производительности.

0 голосов
/ 20 сентября 2008

Как на счет этого ...

select *  
from books  
where title like "%text%"  
or description like "%text%"  
order by case when title like "%text%" then 1 else 0 end desc, date
0 голосов
/ 20 сентября 2008

Вы можете использовать регистр для сортировки по:

order by case when title like '%text%' then 0 else 1 end
0 голосов
/ 20 сентября 2008

Команда union поможет вам. Что-то вроде этого:

SELECT *, 1 as order from books where title like '%text%'
union
SELECT *, 2 as order from books where description like '%text%'
ORDER BY order, date
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...