我正在开发一个Mysql数据库,并且我试图使用'灵活的'在哪里获得最终条件与我的原始查询匹配%。让我用一个例子更清楚地解释一下:
假设我有一个用户表,其中有5种不同的技能,包括ID,姓名,用户组,技能1,技能2,技能3,技能4,技能5。列技能[N]代表技能等级,范围从1到3.
例如,如果我想搜索来自特定用户组的用户,其中level2级别为技能2,级别1为技能4,级别1为技能5,则会运行:
SELECT *
FROM users
WHERE usergroup = 10
AND skill2 = 3
AND skill4 = 1
AND skill5 = 1
但我想要的是返回更多符合这些严格标准的行,与#39%匹配'用我原来的查询。
请求必须返回按'匹配' DESC最后。
你知道怎么做吗?
谢谢!
Paganel
答案 0 :(得分:3)
您可以通过过滤最低接受标准,计算协议分数和按分数排序来实现。请注意"匹配"是一个MySQL关键字;如果要将其指定为列名,则需要引用它。结果可能看起来像这样
SELECT *,
CAST((case skill2 when 3 then 1 else 0 end)
+ (case skill4 when 1 then 1 else 0 end)
+ (case skill5 when 1 then 1 else 0 end) AS FLOAT) / 3.0 AS "match"
FROM users
WHERE usergroup = 10 AND (skill2 = 3 OR skill4 = 1 OR skill5 = 1)
ORDER BY "match" DESC
答案 1 :(得分:1)
为您的数据替换Value1-5,确保为您不想考虑的记录设置NULL值。
如果你添加一个where子句,一定要在技能匹配上使用OR,或者将整个select包装为内联视图,单独返回技能然后限制。
这会动态地处理要以百分比计算的字段,您只需要识别5个技能值中的每一个,或者为null。
Select yourdata,
(Case when skill1=coalesce(Value1,-1) then 1 else 0 end +
Case when skill2=coalesce(Value2,-1) then 1 else 0 end +
Case when skill3=coalesce(Value3,-1) then 1 else 0 end +
Case when skill4=coalesce(Value4-1) then 1 else 0 end +
Case when skill5=coalesce(Value5-1) then 1 else 0 end) /
(case when coalesce(value1,0)>0 then 1 else 0 end+
case when coalesce(value2,0)>0 then 1 else 0 end
case when coalesce(value3,0)>0 then 1 else 0 end
case when coalesce(value4,0)>0 then 1 else 0 end
case when coalesce(value5,0)>0 then 1 else 0 end) as PercentMatch
FROM usergroup
ORDER BY PercentMatch Desc