mysql使用groupby和order by different column排序

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

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

  1. House1 (an entity), price (attribute id = 127), 2000 (value)
  2. House1 (an entity), latitude (attribute id = 137), 1.33 (value)

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

  1. SELECT
  2. eav.entId, eav2.attId, eav2.`double`
  3. FROM
  4. eav eav2 JOIN
  5. eav ON eav2.entId = eav.entId AND eav2.status = 'active' AND eav.status = 'active' AND eav.catId = 53 AND eav2.catId = 53
  6. where
  7. (
  8. (
  9. eav.attId = 6
  10. and
  11. (
  12. eav.`int` = 110
  13. )
  14. )
  15. )
  16. GROUP BY
  17. eav.entId, eav2.attId
  18. HAVING
  19. COUNT(DISTINCT eav.attId) >= 1
  20. ORDER BY
  21. (eav2.attId = 127) DESC,
  22. (eav2.`double`) DESC

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

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

  1. SELECT
  2. eav.entId, eav2.attId, eav2.`double`, MAX(eav2.attId = 127), MAX(eav2.`double`)
  3. FROM
  4. eav eav2 JOIN
  5. eav ON eav2.entId = eav.entId AND eav2.status = 'active' AND eav.status = 'active' AND eav.catId = 53 AND eav2.catId = 53
  6. where
  7. (
  8. (
  9. eav.attId = 6
  10. and
  11. (
  12. eav.`int` = 110
  13. )
  14. )
  15. )
  16. GROUP BY
  17. eav.entId
  18. HAVING
  19. COUNT(DISTINCT eav.attId) >= 1
  20. ORDER BY
  21. MAX(eav2.attId = 127) DESC,
  22. MAX(eav2.`double`) DESC

结果:

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

6jjcrrmo

6jjcrrmo1#

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

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

相关问题