HQL/SQL 根据计数选择前 10 条记录

Posted

技术标签:

【中文标题】HQL/SQL 根据计数选择前 10 条记录【英文标题】:HQL/SQL select top 10 records based on count 【发布时间】:2012-06-21 19:41:20 【问题描述】:

我有两张桌子:

CATEGORY (id)
POSTING (id, categoryId)

我正在尝试编写 HQL 或 SQL 查询来查找帖子数量最多的前 10 个类别。

感谢您的帮助。

【问题讨论】:

你有什么尝试?您正在使用哪个数据库?你是如何定义你的实体的? 我正在使用 mysql,还没有尝试过任何东西。谢谢。 【参考方案1】:

SQL 查询:

SELECT  c.Id, sub.POSTINGCOUNT
FROM CATEGORY c where c.Id IN
( 
    SELECT TOP 10 p.categoryId
    FROM POSTING p
    GROUP BY p.categoryId 
    order by count(1) desc
)

HQL:

Session.CreateQuery("select c.Id
        FROM CATEGORY c where c.Id IN
        ( 
            SELECT  p.categoryId
            FROM POSTING p
            GROUP BY p.categoryId 
            order by count(1) desc
        )").SetMaxResults(10).List();

http://sqlinthewild.co.za/index.php/2010/01/12/in-vs-inner-join/

【讨论】:

【参考方案2】:

在 SQL 中你可以这样做:

SELECT c.Id, sub.POSTINGCOUNT
FROM CATEGORY c 
INNER JOIN 
( 
    SELECT p.categoryId, COUNT(id) AS 'POSTINGCOUNT'
    FROM POSTING p
    GROUP BY p.categoryId
) sub ON c.Id = sub.categoryId
ORDER BY POSTINGCOUNT DESC
LIMIT 10

【讨论】:

太好了,我会试试的。是否有等效的 HQL?谢谢! @user879220,对不起,我不熟悉 HQL,但我认为它会与 SQL 语法非常相似,请参阅此页面,您将找到在 HQL 中编写此 sql 查询所需的所有内容@ 987654321@ 我想我可以在 Hibernate 中使用 SQL,我会尝试的。我发现的唯一另一件事是“mySQL 不支持 Top,您可以使用 SELECT * FROM table LIMIT 5 获取前 5 条记录” @user879220,在 mysql 中使用 LIMIT 10 而不是 TOP(10) 请参阅我的编辑。 @user879220,在 nhibernate 中,您可以使用 Session.CreateSQLQuery('you native sql query here') 直接针对数据库编写 sql 查询,但在 hibernate 中我不知道您如何做到这一点。【参考方案3】:

SQL 可以是:

SELECT c.* from CATEGORY c, (SELECT count(id) as postings_count,categoryId
FROM POSTING 
GROUP BY categoryId ORDER BY postings_count
LIMIT 10) d where c.id=d.categoryId

此输出可以映射到 Category 实体。

【讨论】:

【参考方案4】:

我知道这是一个老问题,但我得到了一个令人满意的答案。

JPQL:

//the join clause is necessary, because you cannot use p.category in group by clause directly
@NamedQuery(name="Category.topN", 
     query="select c, count(p.id) as uses 
            from Posting p 
            join p.category c 
            group by c order by uses desc ")

Java:

List<Object[]> list = getEntityManager().createNamedQuery("Category.topN", Object[].class)
            .setMaxResults(10)
            .getResultList();
//here we must made a conversion, because the JPA cannot order using a non select field (used stream API, but you can do it in old way)
List<Category> cats = list.stream().map(oa -> (Category) oa[0]).collect(Collectors.toList());

【讨论】:

以上是关于HQL/SQL 根据计数选择前 10 条记录的主要内容,如果未能解决你的问题,请参考以下文章

SQL - 选择按多个字段分组的前 n 个,按计数排序

每个色调的堆叠条计数图[重复]

根据计数对记录集进行分类

为啥这个记录计数返回 1?

如何在 hbase 表中获取计数记录?查询记录的最快方法是啥?

mysql触发器“没有” FOR EACH ROW