0

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

订购方式

第一:匹配所有属性的 ID:“Solid”、“Metal”和“Red”

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

第三:只匹配属性的 ID:'Solid'

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

第五:仅匹配属性的 ID:“金属”

第六:只匹配属性的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')和 HAVING 属性 = 3,第二个具有:IN('Solid','Metal')和 HAVING 属性 = 2,第三个具有:IN(' Solid'),第四个带有:IN('Metal','Red')和HAVING Attributes = 2,第五个带有:IN('Metal')和第六个带有IN('Red')

4

1 回答 1

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子句并引入表别名以提高可读性。

编辑:

我认为您也可以order by使用:

order by max(IsSolid) * 4 + max(IsMetal) * 2 + max(IsRed);
于 2013-08-15T01:08:42.400 回答