我一直在尝试订购表格中包含的对象的ID。为此,我使用以下层次结构,该层次结构基于“IN”子句中的属性顺序:
ORDER BY
首先:与所有属性匹配的ID:'Solid'和'Metal'和'Red'
第二名与属性匹配的ID:'Solid'和'Metal'
第三:仅与属性匹配的ID:'Solid'
第四:匹配属性的ID:'Metal'和'Red'
第五名 ID只匹配属性:'Metal'
第六:只匹配属性的ID:'红色'
我正在使用的主要查询是:
SELECT objectattributelink.ID, COUNT(*) Attributes
FROM objectattributelink, attributelist
WHERE objectattributelink.ID = attributelist.AttributeID
AND attributelist.AttributeDesc IN ('Solid', 'Metal', 'Red')
AND objectattributelink.AttributeID BETWEEN 1000 AND 1200
GROUP BY objectattributelink.ID
ORDER BY COUNT(*) DESC
以简化的顺序返回所有ID。在这种情况下,顶部的那些(匹配3个属性)可以,但其余的顺序是随机的。
我目前的解决方案是运行6个不同的查询,但我想知道它是否可以在一个查询中完成。
我基本上为每个查询做的是:
一个用:IN('Solid','Metal','Red')和HAVING Attributes = 3,第二个用:IN('Solid','Metal')和HAVING Attributes = 2,第三个用: IN('Solid'),第四个用:IN('Metal','Red')和HAVING Attributes = 2,第五个用:IN('Metal')和第六个用IN('Red')
答案 0 :(得分:0)
以下查询执行排序:
SELECT oal.ID, COUNT(*) Attributes
FROM objectattributelink oal join
(select al.*,
(case when AttributeDesc = 'Solid' then 1 else 0 end) as IsSolid,
(case when AttributeDesc = 'Metal' then 1 else 0 end) as IsMetal,
(case when AttributeDesc = 'Red' then 1 else 0 end) as IsRed
from attributelist al
) al
on oal.ID = al.AttributeID
where al.AttributeDesc IN ('Solid', 'Metal', 'Red')
AND oal.AttributeID BETWEEN 1000 AND 1200
GROUP BY oal.ID
ORDER BY (case when max(IsSolid) = 1 and max(IsMetal) = 1 and max(IsRed) = 1 then 1
when max(IsSolid) = 1 and max(IsMetal) = 1 then 2
when max(IsSolid) = 1 then 3
when max(IsMetal) = 1 and max(IsRed) = 1 then 4
when max(IsMetal) = 1 then 5
when max(IsRed) = 1 then 6
end);
为便于编写逻辑,查询为每个值引入了三个新变量。然后max()
函数确定该组是否具有这些变量。
我还修复了连接语法以使用on
子句并引入了表别名以提高可读性。
编辑:
我认为您也可以使用<{1}}执行:
order by