2016-06-21 73 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