2013-08-18 99 views
0

我有一个数组已经使用它的一个属性(权重)进行了排序。然后,我在查询中使用这个相同的数组来获取每个“对象”匹配的属性数量。基于订单值的'IN'订单 - MySQL

SELECT objectattributelink.ID, COUNT(*) Attributes 
FROM objectattributelink, attributelist 
WHERE objectattributelink.ID = attributelist.AttributeID 
AND attributelist.AttributeDesc IN ('Solid', 'Metal', 'Red', 'AB', 'Blue', 'Liquid', 'Plastic') 
AND objectattributelink.AttributeID IN ('".implode("', '", $myArray)."') 
GROUP BY objectattributelink.ID 
ORDER BY Attributes DESC, Order of ID's inside 'IN' Clause DESC 

我想这阵在两个层面上进行排序:

  • 主要(最重要的):通过属性的数量它们匹配(已经在做查询)

  • 次要:按照“IN”条款中出现ID的顺序(因此它们在每个'属性数量组'中保持其重量顺序)

第二个是我遇到问题的那个。一直在考虑使用案例,但由于阵列长度不同(2-100),这不是一个选项。

注意:使用Ajax跨域调用从其他服务器获取数据来完成预订(按权重),因此无法执行此查询中的所有操作。

+0

你使用了哪个数据库? –

+0

感谢戈登对我的另一个问题的回答,工作完美。我基本上在这里做同样的事情,但希望这个SQL查询返回两个级别的排序。我实际上使用你建议我进行属性排序的查询。 [链接] http://stackoverflow.com/questions/18244765/order-grouped-values-by-custom-rank-sql [7链接](我正在使用这个简化版本的查询这个问题。但现在选择一个ID的自定义数组) – Mazka

+0

你知道这个评论是不适用于任何不是@Mazka的人,对吧? :)你可能会链接到你以前的相关问题吗? - inflagranti 12分钟前 –

回答

0

有两个问题。首先,您不能按列中不出现的列进行排序。其次,你必须创建一个临时表,而不是在为后来这样的事情应该工作:

SELECT objectattributelink.ID, COUNT(*) Attributes 
FROM objectattributelink, attributelist, TABLE (VALUES ('Solid', 1), ('Metal', 2), ('Red', 3), ('AB', 4), ('Blue', 5), ('Liquid', 6), ('Plastic', 7)) AS descs(AttributeDesc, AttributeNo) 
WHERE objectattributelink.ID = attributelist.AttributeID 
AND attributelist.AttributeDesc = descs.AttributeDesc 
AND objectattributelink.AttributeID IN ('".implode("', '", $myArray)."') 
GROUP BY objectattributelink.ID 
ORDER BY Attributes DESC, descs.AttributeNo 

然而,这仍然是无效的,因为descs.AttributeNo列不是组由。另外我不知道比DB2之外的任何数据库支持此...

所以修复组的问题,你就必须通过改变您的组:

GROUP BY objectattributelink.ID, descs.AttributeNo 

这应该不会改变分组本身,因为ID意味着attributeno。

而且,我不知道,但你可能还必须通过改变您的订单:

ORDER BY 2 DESC, descs.AttributeNo 

所以最终的查询应该是这样的:

SELECT objectattributelink.ID, COUNT(*) Attributes 
FROM objectattributelink, attributelist, TABLE (VALUES ('Solid', 1), ('Metal', 2), ('Red', 3), ('AB', 4), ('Blue', 5), ('Liquid', 6), ('Plastic', 7)) AS descs(AttributeDesc, AttributeNo) 
WHERE objectattributelink.ID = attributelist.AttributeID 
AND attributelist.AttributeDesc = descs.AttributeDesc 
AND objectattributelink.AttributeID IN ('".implode("', '", $myArray)."') 
GROUP BY objectattributelink.ID 
ORDER BY 2 DESC, descs.AttributeNo 

最后,也可以使用row_number来不必明确地输入数字:

SELECT objectattributelink.ID, COUNT(*) Attributes 
FROM objectattributelink, attributelist, 
    (SELECT AttributeDesc, row_number() over() AS AttributeNo FROM VALUES (('Solid'), ('Metal'), ('Red'), ('AB'), ('Blue'), ('Liquid'), ('Plastic')) AS (AttributeDesc)) AS descs 
WHERE objectattributelink.ID = attributelist.AttributeID 
AND attributelist.AttributeDesc = descs.AttributeDesc 
AND objectattributelink.AttributeID IN ('".implode("', '", $myArray)."') 
GROUP BY objectattributelink.ID 
ORDER BY 2 DESC, descs.AttributeNo