繁体   English   中英

如何获取按行分组的计数-SQL

[英]How to get the count of a grouped by rows - SQL

所以我有这张桌子

表格:“ tbl_hash”

 ------------------------------
| id | hash1 | hash2 | hash3 |
------------------------------
| 1  |   a   |   b   |   c   |
| 2  |   a   |   b   |   c   |
| 3  |   a   |   g   |   d   |
| 4  |   a   |   g   |   d   |
| 5  |   a   |   g   |   d   |
------------------------------

我只想按hash1,hash2和hash3对它们进行分组。 计算它们,只返回高2的计数。

所以我有这个查询来获取我想要的值:

select CONCAT(hash1, hash2, hash3) as hashes, COUNT(*) as count from `tbl_hash` group by hashes having `count` > 2 limit 5

^^上面的查询工作完美..

但是,如果我想获取数据并为每一行计数怎么办? 预期产量:

--------------------------------------
| id | hash1 | hash2 | hash3 | count | 
--------------------------------------
| 1  |   a   |   b   |   c   |   2   |
| 2  |   a   |   b   |   c   |   2   |
| 3  |   a   |   g   |   d   |   3   |
| 4  |   a   |   g   |   d   |   3   |
| 5  |   a   |   g   |   d   |   3   |
--------------------------------------

我还计划使用DB::table...将其转换为查询生成器DB::table...

您可以将原始表连接到一个子查询,该子查询查找每个组的计数:

SELECT t1.*, t2.cnt
FROM tbl_hash t1
INNER JOIN
(
    SELECT hash1, hash2, hash3, COUNT(*) AS cnt
    FROM tbl_hash
    GROUP BY hash1, hash2, hash3
    HAVING COUNT(*) > 2
) t2
     ON t1.hash1 = t2.hash1 AND
        t1.hash2 = t2.hash2 AND
        t1.hash3 = t2.hash3;

请注意,我在上面写的内容将完全过滤出不属于计数大于2的hash1 / hash2 / hash3组的所有原始记录。如果您希望所有记录都带有该计数,则删除HAVING子句。

附带说明一下,在支持分析功能的数据库(例如SQL Server和Oracle)中,我们可以使用COUNT作为分析功能来编写冗长的查询。 在某些时候,MySQL的主流版本也将支持此功能。 但是目前,我们仍然坚持加入。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM