gpt4 book ai didi

mysql - 基于 'IN' 顺序的订单值 - MySQL

转载 作者:行者123 更新时间:2023-11-30 01:23:15 26 4
gpt4 key购买 nike

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

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 跨域调用从其他服务器获取数据来完成的,因此不可能在此查询中执行所有操作。

最佳答案

有两个问题。首先,您不能按未出现在分组依据中的列进行排序。其次,您必须创建一个临时表而不是 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 之外的任何 DB 是否支持此...

因此,要解决分组依据问题,您必须将分组依据更改为:

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

关于mysql - 基于 'IN' 顺序的订单值 - MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18303511/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com