如何获取按行分组的计数 - SQL
How to get the count of a grouped by rows - SQL
所以我有这个table
table: "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 对它们进行分组。计算它们,只有 return 高 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...
将它们转换为查询生成器
您可以将您的原始 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;
请注意,我上面写的内容将完全过滤掉属于 hash1/hash2/hash3 组且计数不大于 2 的任何原始记录。如果您想要所有记录,以及计数,则删除HAVING
子句。
附带说明一下,在支持分析函数的数据库中,例如 SQL Server 和 Oracle,我们可以使用 COUNT
作为分析函数来编写更简洁的查询。在某些时候, MySQL 的主流版本也会支持这一点。但是现在,我们只能进行连接。
所以我有这个table
table: "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 对它们进行分组。计算它们,只有 return 高 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...
您可以将您的原始 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;
请注意,我上面写的内容将完全过滤掉属于 hash1/hash2/hash3 组且计数不大于 2 的任何原始记录。如果您想要所有记录,以及计数,则删除HAVING
子句。
附带说明一下,在支持分析函数的数据库中,例如 SQL Server 和 Oracle,我们可以使用 COUNT
作为分析函数来编写更简洁的查询。在某些时候, MySQL 的主流版本也会支持这一点。但是现在,我们只能进行连接。