0

我有一个数组,它已经使用它的一个属性(权重)进行了排序。然后,我在查询中使用相同的数组来获取每个“对象”匹配的属性数。

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

我试图在两个级别上对这个数组进行排序:

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

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

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

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

4

1 回答 1

0

有两个问题。首先,您不能按未出现在 group by 中的列排序。其次,您必须创建一个临时表而不是 in。对于以后这样的事情应该可以工作:

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 意味着属性号。

另外,我不确定,但您可能还必须将订单更改为:

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
于 2013-08-18T20:54:32.987 回答