2017-03-06 41 views
1

在SQL中我有點新。我試圖做的是按照匹配標準的降序對行進行排序。 當我說匹配標準時,我的意思是那些與我的SQL查詢具有更多匹配列的行應該排在第一位。像任何方式來排序在SQL中的行提取使用匹配標準

SELECT a.*, 
     f.* 
FROM a 
     INNER JOIN f as f 
       ON f.fid = a.aid 
WHERE (a.icid = 25290 
     AND a.pt = 2) 
     AND (f.st LIKE '%Outpatient%' 
       OR f.st LIKE '%Service201%') 

現在我行的順序應該是,如果它匹配所有它應該在上面,然後在第二個應該是具有所有列,但F.ST匹配,則等於是一個向前。

例如

我有一個表名測試 列名5列

ID,姓名,FNAME,城市,國家

我的查詢

SELECT * 
FROM TEST 
WHERE name LIKE "%John%" 
    OR fname LIKE "%Mike%" 
    OR city IN ("Abu Dhabi, New York, Manchester") 
    OR country IN ("USA, UAE, UK") 

說我對這個查詢有10行。 什麼,我想要的是匹配所有的行應該來在結果的頂部設置 像下面

名,FNAME,城市,counrty

約翰·麥克,紐約,美國 - >匹配的所有四個字段

約翰·麥克,德里,英國 - >匹配三個字段

約翰,汗,拉合爾,美國 - >匹配的是兩個領域

約翰,汗,拉合爾,PK - >一個字段匹配

約翰·麥克,汗,拉合爾,PK - >匹配一個領域

+0

也許如果你想補充的示例數據和預期的結果將是更清楚,你會得到更多的答案 – GuidoG

+0

如果你想通過'like matches'命令你必須使用sql'IF()' – JustOnUnderMillions

+0

打破你的查詢並使用union all – KumarHarsh

回答

0

我來回答根據你的第二個聲明你的問題;那麼您可以將此策略應用於其他案例。 假設你想衡量幾個標準;然後,您可以 - 對於每個條件 - 使用if - 如果未滿足,則返回0,如果滿足,則返回「某些權重」。 「按訂單」這個重量在外部查詢中添加每個標準這些權重的子查詢:

Select name, fname, city, country 
from 
    (SELECT *, (if(name LIKE "%John%"),8,0) 
      + if(fname LIKE "%Mike%", 4,0) 
      + if(city IN ("Abu Dhabi, New York, Manchester"), 2,0) 
      + if(country IN ("USA, UAE, UK"), 1,0)) as weight 
    FROM TEST) weightedTest 
where weight > 0 
order by weight desc 

當然你也可以根據自己的需求調整的權重;如果您只想計算滿足的標準數量,則可以爲每個標準分配權重1。

2

MySQL將在數字上下文中將布爾表達式視爲整數。這使得你的問題很容易回答:

SELECT a.*, f.* 
FROM a INNER JOIN 
    f f 
    ON f.fid = a.aid 
WHERE a.icid = 25290 AND 
     a.pt = 2 AND 
     (f.st LIKE '%Outpatient%' OR f.st LIKE '%Service201%') 
ORDER BY ((f.st LIKE '%Outpatient%') + (f.st LIKE '%Service201%')) DESC; 

注意:您可以把同樣的表達在SELECT,如果你喜歡:

SELECT . . ., 
     ((f.st LIKE '%Outpatient%') + (f.st LIKE '%Service201%') 
     ) as numMatches 
. . . 
+0

利用類型轉換(+1)的好方法。小記:如果其中一個表達式返回NULL,那麼整體numMatches也將爲NULL。這可能不是有意的,儘管在這裏並不重要,因爲它總是處理'f.st'。 –

+0

@StephanLechner。 。 。爲了讓布爾表達式返回NULL,'f.st'必須是'NULL'。 。 。 'WHERE'子句會過濾掉這些行。 –

相關問題