基于其';在';订单-MySQL
我有一个数组,它已经使用它的一个属性(权重)进行了排序。然后在查询中使用相同的数组来获取每个“对象”匹配的属性数基于其';在';订单-MySQL,mysql,sql,sorting,sql-order-by,Mysql,Sql,Sorting,Sql Order By,我有一个数组,它已经使用它的一个属性(权重)进行了排序。然后在查询中使用相同的数组来获取每个“对象”匹配的属性数 SELECT objectattributelink.ID, COUNT(*) Attributes FROM objectattributelink, attributelist WHERE objectattributelink.ID = attributelist.AttributeID AND attributelist.AttributeDesc IN ('Solid',
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”子句中的显示顺序(因此它们在每个“属性数”组中保持其权重顺序)
注意:预排序(按权重)是使用Ajax跨域调用从其他服务器获取数据来完成的,因此不可能在该查询中完成所有操作。有两个问题。首先,不能按未出现在分组依据中的列排序。其次,您必须创建一个临时表,而不是中的。对于后一种情况,类似这样的方法应该会起作用:
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
列不在group by中。此外,我不确定除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
你用的是什么数据库?谢谢戈登回答我的另一个问题,效果很好。我在这里基本上也在做同样的事情,但是希望这个SQL查询在两个级别上返回排序。实际上,我正在使用您建议我的查询进行属性排序。[链接]使用此问题的简化查询版本。与上次相同的DB,但现在选择了一个自定义ID数组)您知道此注释对任何不是@Mazka的人都没有用处,对吧?:)您可以链接到您之前的相关问题吗?-12分钟前发生了火灾