我試圖根據用戶正在查看的當前作業,列出類似的作業。
當前作業地點:
本地區域:溫哥華市中心
溫哥華市中心
城市:溫哥華
步驟1:篩選作業。
第1步:根據 "溫哥華市中心"、"溫哥華 "和 "不列顛哥倫比亞省 "過濾作業,并按""溫哥華市中心 "本地區 "的順序回傳10份作業
第2步:如果我們在第1步中沒有找到10個作業,那么我們就在 "溫哥華 "和 "不列顛哥倫比亞 "尋找作業,并按 "溫哥華 "的順序回傳10個作業。第3步:如果我們在第2步中沒有找到10個作業,那么我們就在 "不列顛哥倫比亞省 "中尋找作業,并按 "不列顛哥倫比亞省 "回傳前10個作業順序。
因此,尋找類似作業的搜索順序從最低級別即 "本地區 "開始,然后如果沒有,我們就轉到 "城市",反之亦然。
在最后的結果中,我想從最低層的 "本地區 "開始列出作業,然后我們轉移到 "城市",然后是 "州"。
表 :
Jobs:
JobId Title LocationId Salary
地點。
LocationId CountryId StateId CityId LocalZoneId
查詢 :
DECLARE
@currentJobId INT = 101,
@currentJobLocalZoneId INT = 201,
@currentJobCityId INT = 301,
@currentStateId INT = 401.
SELECT TOP 10
j.JobId。
j.Title,
j.薪資
l.StateId,
l.CityId,
l.LocalZoneId
FROM Jobs j
LEFT JOIN Location l ON l.LocationId = j.LocationId
WHERE
j.JobId != @currentJobId !
AND (@currentJobLocalZoneId IS NULL or l. LocalZoneId = @currentJobLocalZoneId)
AND (@currentJobCityId IS NULL OR l. CityId = @currentJobCityId)
AND (@currentStateId IS NULL OR l. StateId = @currentStateId)
ORDER BY
--不知道如何對從最低級別的 "本地區 "開始的結果進行排序,然后我們移動到 "城市",然后是 "州"。
但在上述查詢中,我對如何實作自下而上的方法感到困惑,即首先從 "本地區 "開始,如果我們沒有找到10個作業,那么我們就轉到 "市",然后是 "州"。
誰能幫助或指導我實作這一部分呢?
uj5u.com熱心網友回復:
我們的想法是創建一個運算式,回傳一個代表結果 "接近度 "的整數。例如,在你的案例中,你可以使用:
CASE WHEN l. LocalZoneId = @currentJobLocalZoneId THEN 1
WHEN l.CityId = @currentJobCityId THEN 2
WHEN l.StateId = @currentStateId THEN 3
ELSE 4
END
...然后你ORDER BY這個表達。
uj5u.com熱心網友回復:
假設引數是一個層次結構的一部分,即地方區域包含在城市中,而城市又包含在州中,你需要執行一個查詢,將越來越廣泛的匹配結果結合起來:
select top 10 JobId, Title, Salary, StateId, CityId, LocalZoneId
from (
--本地區。
select J.JobId, J.Title, J.Salary, L.StateId, L.CityId, L.LocalZoneId。
1 as OrderRank --這些結果在前面。
from Jobs as J left outer join
地點 as L on L.LocationId = J.LocationId
where J.JobId != @currentJobId and --絕不包括當前作業。
L.LocalZoneId = @ currentJobLocalZoneId
union all
--城市.
select J.JobId, J.Title, J.Salary, L.StateId, L.CityId, L.LocalZoneId。
2 --第二選擇結果。
from Jobs as J left outer join
地點 as L on L.LocationId = J.LocationId
where J.JobId != @currentJobId and --絕不包括當前職位。
L.CityId = @currentJobCityId
union all
-- State.
select J.JobId, J.Title, J.Salary, L.StateId, L.CityId, L.LocalZoneId。
3 --第三選擇結果。
from Jobs as J left outer join
地點 as L on L.LocationId = J.LocationId
where J.JobId != @currentJobId and --絕不包括當前作業。
L.StateId = @currentStateId >。
) as FilteredJobs
order by OrderRank;
注意,需要正確設定過濾器的值,例如,如果你想按城市過濾,那么 @currentJobCityId 和 @currentStateId都需要正確設定,以便在城市沒有10個合適的作業機會時,可以從城市退回到州。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/311036.html
標籤:
下一篇:ActiveMQArtemis前綴為“jms.topic”。到SpringBootClient上定義的所有主題名稱
