按自定义秩对分组值排序-SQL

按自定义秩对分组值排序-SQL,sql,group-by,sql-order-by,Sql,Group By,Sql Order By,我一直在尝试对表中包含的对象的ID进行排序。为此,我使用以下层次结构,它基于“IN”子句中属性的顺序: 订购人 首先:匹配所有属性的ID:“固体”和“金属”以及“红色” Second:与属性匹配的ID:'Solid'和'Metal' Third:ID仅与属性“Solid”匹配 第四个:ID匹配属性:“金属”和“红色” Fifth:ID只匹配属性:“金属” Sixth:ID与属性“Red”匹配 我使用的主要查询是: SELECT objectattributelink.ID, COUNT(*) A

我一直在尝试对表中包含的对象的ID进行排序。为此,我使用以下层次结构,它基于“IN”子句中属性的顺序:

订购人

首先:匹配所有属性的ID:“固体”和“金属”以及“红色”

Second:与属性匹配的ID:'Solid'和'Metal'

Third:ID仅与属性“Solid”匹配

第四个:ID匹配属性:“金属”和“红色”

Fifth:ID只匹配属性:“金属”

Sixth:ID与属性“Red”匹配

我使用的主要查询是:

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'),属性为3,第二个带:IN('Solid'、'Metal'),属性为2,第三个带:IN('Solid'),第四个带:IN('Metal'),属性为2,第五个带:IN('Metal'),第六个带IN('Red')

以下查询进行排序:

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()
函数确定组中是否有这些变量

我还修复了join语法以使用
on
子句,并引入了表别名以提高可读性

编辑:

我认为您也可以使用以下方法来执行
订单:

order by max(IsSolid) * 4 + max(IsMetal) * 2 + max(IsRed);