按自定义秩对分组值排序-SQL
我一直在尝试对表中包含的对象的ID进行排序。为此,我使用以下层次结构,它基于“IN”子句中属性的顺序: 订购人 首先:匹配所有属性的ID:“固体”和“金属”以及“红色” Second:与属性匹配的ID:'Solid'和'Metal' Third:ID仅与属性“Solid”匹配 第四个:ID匹配属性:“金属”和“红色” Fifth:ID只匹配属性:“金属” Sixth:ID与属性“Red”匹配 我使用的主要查询是:按自定义秩对分组值排序-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
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);