【问题标题】:Any way to sort the Rows Fetch in SQL Using matching Criteria使用匹配条件对 SQL 中的行获取进行排序的任何方式
【发布时间】:2017-03-06 10:33:03
【问题描述】:

我对 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 行针对此查询。 我想要的是匹配所有的行应该在结果集的顶部 喜欢关注

姓名、姓氏、城市、国家

John, Mike, New York, USA -> 匹配所有四个字段

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

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

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

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

【问题讨论】:

  • 如果您添加示例数据和预期结果,可能会更清楚,您会得到更多答案
  • 如果要订购必须使用sql IF()like matches
  • 打破您的查询并使用 union all
  • 我可以有一个示例代码,请问如何做到这一点。
  • @GuidoG 我添加了一些示例代码。你从中得到什么?谁能实现我想做的事。

标签: mysql sql


【解决方案1】:

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)。小提示:如果其中一个表达式返回NULL,那么整体numMatches 也将是NULL。这可能不是故意的,尽管在这里无关紧要,因为它始终是f.st
  • @StephanLechner 。 . .为了让布尔表达式返回 NULLf.st 必须是 NULL。 . . WHERE 子句会过滤掉这些行。
【解决方案2】:

让我根据您的第二个陈述回答您的问题;然后,您可以将此策略应用于其他情况。 假设您要加权几个标准;然后,您可以 - 对于每个标准 - 使用 if-statement,如果未满足则返回 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 的权重。

【讨论】:

    猜你喜欢
    • 2011-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-10
    相关资源
    最近更新 更多