假设我们有一个汽车经销商网站,可以搜索品牌,型号,类型和年份。完整的搜索字词将是 Toyota Corolla Sedan 2006 。 “丰田”由主 Cars 表中的简单数字ID键表示,“Corolla”和“Sedan”也是如此。 Make,Model和Sedan的键引用制作,模型和 Car_Types 表。
查询应首先返回完全匹配,即。所有汽车都是2006年的丰田Corollas。然后同样的问题应该从2006年以后的年份返回Corollas,按相关性递减顺序排列,因此接近2006年将是第一次,然后是更远的几年,然后它将返回其他丰田汽车那不是卡罗拉,但仍然是轿车,最后是其他丰田,既不是卡罗拉也不是轿车。
使用基于搜索参数的UNIONs编写多阶段动态SQL查询是可以容忍的(如果很麻烦),但我不禁觉得有一个优雅的,一步到位的方法来做到这一点。当然,如果没有更好,更明智的方法,那么我可能最终会采用UNION方法:
SELECT * FROM (
SELECT Car_ID, 1 as ResultOrder FROM Cars
WHERE Make_ID = 1 AND Model_ID = 5 AND Car_Type_ID = 7 AND Year = 2006
UNION
SELECT Car_ID, 2 as ResultOrder FROM Cars
WHERE Make_ID = 1 AND Model_ID = 5 AND Car_Type_ID = 7
UNION
SELECT Car_ID, 3 as ResultOrder FROM Cars
WHERE Make_ID = 1 AND Car_Type_ID = 7
UNION
SELECT Car_ID, 4 as ResultOrder FROM Cars
WHERE Make_ID = 1
) AS Results
ORDER BY ResultOrder
感觉笨重。它不够优雅。如果你能建议一个更健全,更高效的方法,我会全神贯注。谢谢你的时间!
答案 0 :(得分:1)
您可以按顺序使用表达式。
SELECT car_id
FROM cars
WHERE Make_ID = 1
ORDER BY Year = 2006, Car_Type_ID = 7, Model_ID = 5
答案 1 :(得分:1)
这是使用case
声明的另一种选择:
SELECT Car_ID,
CASE WHEN Model_Id = 5 AND Car_Type_Id = 7 AND Year = 2006 THEN 1
WHEN Model_Id = 5 AND Car_Type_Id = 7 THEN 2
WHEN Model_Id = 5 THEN 3
ELSE 4
END as ResultOrder
FROM Cars
WHERE Make_ID = 1
ORDER BY ResultOrder