我在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 - >匹配一个字段
答案 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。