我试图从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列中按其值从高到低排序。
1条答案
按热度按时间6jjcrrmo1#
您似乎需要一个带有排序的聚合。像这样: