使用匹配条件在SQL中对Rows Fetch进行排序的任何方法

时间:2017-03-06 10:33:03

标签: mysql 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的那个,然后依此类推。

例如

我在表名Test中有5列 列的名称是

id,name,fname,city,country

我的查询

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行。 我想要的是匹配all的行应该位于结果集的顶部 喜欢以下

姓名,名称,城市,国家

John,Mike,纽约,美国 - >匹配所有四个字段

John,Mike,Delhi,UK - >匹配三个字段

John,Khan,Lahore,USA - >匹配两个字段

John,Khan,Lahore,PK - >匹配一个字段

John Mike,Khan,Lahore,PK - >匹配一个字段

2 个答案:

答案 0 :(得分: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
. . .

答案 1 :(得分: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。