ORDER按自定义排名 - SQL分组值

时间:2013-08-15 01:02:58

标签: sql group-by sql-order-by

我一直在尝试订购表格中包含的对象的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')

1 个答案:

答案 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