Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于其';在';订单-MySQL_Mysql_Sql_Sorting_Sql Order By - Fatal编程技术网

基于其';在';订单-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”子句中的显示顺序(因此它们在每个“属性数”组中保持其权重顺序)

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


注意:预排序(按权重)是使用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分钟前发生了火灾