mysql使用groupby和order by different column排序

kninwzqo  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(320)

我试图从eav表(entity属性值)中获取唯一的entid。但是我也需要按属性从高到低对值进行排序,但是这个属性并不存在于所有的实体中,只有一些实体有这个属性。具有此属性的实体必须位于顶部,然后从高到低跟随其值。实际上,我已经实现了这一点,但我必须使用1个主查询和2个嵌套子查询的总和。就性能而言,现在我想看看是否可以只使用一个查询来实现这一点,如果不可能,那么使用一个主查询+1个子查询。
下面是一个简化的sql和实际应用程序表。
entid是实体id的外键
attid是属性id的外键
double是该实体的值
例如,

House1 (an entity), price (attribute id = 127), 2000 (value) 

House1 (an entity), latitude (attribute id = 137), 1.33 (value)

一个实体可以有无限多个不同的属性。房子只是一个实体类别的一个例子,可以有无限多个不同的类别,如动物,国家,车辆,反过来每一个都可以有无限的属性。
这里是一个尝试,这个查询得到正确的顺序,我想在那个双栏,但entid不是唯一的,它有重复,如果我添加一个独特的,结果将不再是顺序。

SELECT
        eav.entId, eav2.attId, eav2.`double`
FROM
          eav eav2 JOIN 
          eav ON eav2.entId = eav.entId AND eav2.status = 'active' AND eav.status = 'active' AND eav.catId  = 53 AND eav2.catId  = 53 
where    

          (

              (
                       eav.attId = 6
                       and
                       (
                                eav.`int` = 110
                       )
              )     
          )

GROUP BY
          eav.entId, eav2.attId
HAVING
          COUNT(DISTINCT eav.attId)      >= 1

ORDER BY 
    (eav2.attId = 127) DESC,
    (eav2.`double`) DESC

结果的摘录,您可以看到重复的entid

这里是另一个使用max aggregate的尝试,这将得到唯一的entid和一些正确的排序,但有一个不正确,因为值为3000的top结果不应该在顶部,因为这个值不属于我正在排序的属性(attid=127),但它实际上属于attid=137。因为这两个聚合max是独立排序的。也许有什么方法可以让他们用concat绑在一起?

SELECT
        eav.entId, eav2.attId, eav2.`double`, MAX(eav2.attId = 127), MAX(eav2.`double`)
FROM
          eav eav2 JOIN 
          eav ON eav2.entId = eav.entId AND eav2.status = 'active' AND eav.status = 'active' AND eav.catId  = 53 AND eav2.catId  = 53 
where    

          (

              (
                       eav.attId = 6
                       and
                       (
                                eav.`int` = 110
                       )
              )     
          )

GROUP BY
          eav.entId
HAVING
          COUNT(DISTINCT eav.attId)      >= 1

ORDER BY 
    MAX(eav2.attId = 127) DESC,
    MAX(eav2.`double`) DESC

结果:

我想要的是:不显示重复的entid,attid=127 all on top result,然后在double列中按其值从高到低排序。

6jjcrrmo

6jjcrrmo1#

您似乎需要一个带有排序的聚合。像这样:

SELECT eav.entId,
       MAX(CASE WHEN eav.key = 127 THEN value end) as price,
       MAX(CASE WHEN eav.key = 137 THEN value end) as latitude
FROM eav 
GROUP BY eav.entId
ORDER BY price DESC;

相关问题