2016-06-21 74 views
2

您好我现在面临一个问题, 我有我需要从分贝在where子句选择数据的匹配列的优先级在where子句

前根据匹配列的优先级数据的情况。我有一张桌子

Employee: FirstName, LastName, City, State. 

我想根据标准搜索员工的记录。但情况是,首先我需要获得所有四条标准(列)匹配的记录,然后是四条标准中的三条(列)相匹配的所有记录,然后是四条标准中的两条(列)匹配等等。

为此我创建了基于情况的动态查询,但是如果搜索条件将会扩展得更多,那么我需要在查询中放置很多条件,这将很难管理动态查询。那么还有其他方法可以解决这个问题吗?

很多预先感谢。

+1

不要用语言描述你的结构,*视觉*向我们展示的表结构。还请提供一些示例数据,您尝试过的查询以及您的预期结果。 – Siyual

+0

换句话说,您想要将搜索结果与排名一起呈现给最终用户。如果是这种情况,我建议使用索引框架,而不是直接在SQL中执行此操作。 –

回答

3

这已经在SQL Server上测试过,但是如果它不能马上工作,应该给你一个关于MySQL的想法;

测试数据

IF OBJECT_ID('tempdb..#TestData') IS NOT NULL DROP TABLE #TestData 
GO 
CREATE TABLE #TestData (FirstName varchar(20), LastName varchar(20), City varchar(20), State varchar(20)) 
INSERT INTO #TestData (FirstName, LastName, City, State) 
VALUES 
('Jon','Snow','Winterfell','Westeros') 
,('Jaime','Lannister','Riverrun','Westeros') 
,('Margaery','Tyrell','Kings Landing','Westeros') 
,('Cersei','Lannister','Kings Landing','Westeros') 
,('Daenerys','Targaryen','Mereen','Essos') 
,('Davos','Seaworth','Winterfell','Westeros') 
,('Theon','Greyjoy','Mereen','Essos') 
,('Tyrion','Lannister','Mereen','Essos') 
,('Petyr','Baelish','Winterfell','Westeros') 

查询与设置为变量的搜索条件。 case将检查我们有多少匹配以及该字段的order

DECLARE @Variable1 varchar(20); SET @Variable1 = 'Jon' 
DECLARE @Variable2 varchar(20); SET @Variable2 = 'Snow' 
DECLARE @Variable3 varchar(20); SET @Variable3 = 'Winterfell' 
DECLARE @Variable4 varchar(20); SET @Variable4 = 'Westeros' 


SELECT 
FirstName 
,LastName 
,City 
,State 
,CASE WHEN FirstName = @Variable1 THEN 1 ELSE 0 END + 
CASE WHEN LastName = @Variable2 THEN 1 ELSE 0 END + 
CASE WHEN City = @Variable3 THEN 1 ELSE 0 END + 
CASE WHEN State = @Variable4 THEN 1 ELSE 0 END Matches 

FROM #TestData 
ORDER BY (
      CASE WHEN FirstName = @Variable1 THEN 1 ELSE 0 END + 
      CASE WHEN LastName = @Variable2 THEN 1 ELSE 0 END + 
      CASE WHEN City = @Variable3 THEN 1 ELSE 0 END + 
      CASE WHEN State = @Variable4 THEN 1 ELSE 0 END 
     ) DESC 

其中给出结果为;

FirstName LastName City   State  Matches 
Jon   Snow  Winterfell  Westeros 4 
Davos  Seaworth Winterfell  Westeros 2 
Petyr  Baelish  Winterfell  Westeros 2 
Jaime  Lannister Riverrun  Westeros 1 
Margaery Tyrell  Kings Landing Westeros 1 
Cersei  Lannister Kings Landing Westeros 1 
Daenerys Targaryen Mereen   Essos  0 
Theon  Greyjoy  Mereen   Essos  0 
Tyrion  Lannister Mereen   Essos  0 
+0

非常感谢@RichBenner的回答。我会尽力实施这个逻辑 – manojkumar

+0

乐意提供帮助。这种解决方案的优点是,如果需要的话,您可以对每个变量进行加权,使其在分类中更加重要。例如如果FirstName/LastName更重要,那么在case语句中将它们更改为2。如果此答案确实解决了您的问题,请随时将答案标记为已接受。 –

+0

是的@RichBenner,这个答案对我来说真的很有帮助。非常感谢您解决我的问题。再次感谢。 – manojkumar

0

您可以使用您的条件作为+1排名您的记录。

http://sqlfiddle.com/#!9/f65790/3

SELECT FirstName, LastName, City, State 
FROM Employee 
ORDER BY (FirstName = 'John') 
     + (LastName='Snow') 
     + (City='Winterfell') 
     + (State='Nord') DESC 

或者,如果你需要检查排名downthere地方:

SELECT FirstName, LastName, City, State, 
     (FirstName = 'John') 
     + (LastName='Snow') 
     + (City='Winterfell') 
     + (State='Nord') Rank 
FROM employee 
ORDER BY Rank DESC; 
+0

*乔恩 - 你什么也不知道:) –

+0

@亚历克斯,谢谢你的回答。但它不适用于MS SQL服务器。 – manojkumar