2014-03-06 28 views
1

我遇到了在數據庫中爲搜索值設置優先級的問題。我想找到所有的課程,在名稱課程中有一個短語(或包含短語的詞)。 此外,與返回的數據中名稱與搜索詞組名稱完全相同的課程名列第一。如何爲搜索值設置優先級

記錄爲當然表:

+----+------+-------------------+ 
| id | code |  name  | 
+----+------+-------------------+ 
| 1 | JPA | JPA lorem ipsum | 
| 2 | JSF | Jsf lorem ipsum | 
| 3 | HIB | HIB lorem ipsum | 
| 4 | TEB | TEB lorem ipsum | 
| 5 | ZRN | Thanks in advance | 
+----+------+-------------------+ 

我的查詢:

SELECT `course`.`id`, `course`.`name` 
FROM `course` 
WHERE `name` LIKE 'TEB lorem ipsum' or 
     `name` LIKE '%TEB%' or 
     `name` LIKE '%lorem%' or 
     `name` LIKE '%ipsum%' 

數據庫返回:

+----+-----------------+ 
| id |  name  | 
+----+-----------------+ 
| 1 | JPA Lorem ipsum | 
| 2 | Jsf Lorem ipsum | 
| 3 | HIB Lorem ipsum | 
| 4 | TEB lorem ipsum | 
+----+-----------------+ 

我希望收到:

+----+-----------------+ 
| id |  name  | 
+----+-----------------+ 
| 4 | TEB lorem ipsum | 
| 1 | JPA Lorem ipsum | 
| 2 | Jsf Lorem ipsum | 
| 3 | HIB Lorem ipsum | 
+----+-----------------+ 

記錄,其中4id是最匹配的並且是返回數據中的第一位。問題,我該怎麼辦?

在此先感謝!

回答

3

這可能會訣竅。

SELECT `course`.`id`, `course`.`name` 
FROM `course` 
WHERE `name` LIKE 'TEB lorem ipsum' or 
     `name` LIKE '%TEB%' or 
     `name` LIKE '%lorem%' or 
     `name` LIKE '%ipsum%' 
ORDER BY CASE WHEN `name`='TEB lorem ipsum' THEN 1 ELSE 2 END ASC 

總之,它檢查名稱是否等於值,並給它一個1,否則一個2.然後它按升序對它進行排序。

+0

我認爲一個簡單的IF應該做的伎倆,不是? 'IF(name ='TEB lorem ipsum',1,2);' – CentaurWarchief

+0

非常感謝你們!第一和第二個解決方案很好,它的工作原理!謝謝! – Piotr