如何在MySQL中获取具有同一表计数的列

Posted

技术标签:

【中文标题】如何在MySQL中获取具有同一表计数的列【英文标题】:How to get the columns with count of the same table in MySQL 【发布时间】:2020-11-01 10:18:46 【问题描述】:

我在 laravel 上工作时遇到了麻烦,无法统计有多少用户赞助了这张名为 users 的表格,数据如下所示。

|--------------|----------------  |-------------|
|      id      |    first_name    | sponsor_id  |
|--------------|------------------|-------------|
|       59     |    kaqefizew     |   NULL      |
|--------------|------------------|-------------|
|       68     |    fucifaxe      |   59        |
|--------------|------------------|-------------|
|       81     |    fepetora      |   59        |
|--------------|------------------|-------------|
|       82     |    kixys         |   81        |
|--------------|------------------|-------------|

并且需要如下输出

|--------------|----------------  |------------------|
|      id      |    first_name    | sponsored_count  |
|--------------|------------------|------------------|
|       59     |    kaqefizew     |   2              |
|--------------|------------------|------------------|
|       68     |    fucifaxe      |   0              |
|--------------|------------------|------------------|
|       81     |    fepetora      |   1              |
|--------------|------------------|------------------|
|       82     |    kixys         |   0              |
|--------------|------------------|------------------|

我尝试使用计数子句

SELECT id, first_name, COUNT(sponsor_id) as sponsored_count FROM `users` GROUP BY id

但我得到如下错误输出

|--------------|----------------  |------------------|
|      id      |    first_name    | sponsored_count  |
|--------------|------------------|------------------|
|       59     |    kaqefizew     |   0              |
|--------------|------------------|------------------|
|       68     |    fucifaxe      |   1              |
|--------------|------------------|------------------|
|       81     |    fepetora      |   1              |
|--------------|------------------|------------------|
|       82     |    kixys         |   1              |
|--------------|------------------|------------------|

关系

class User extends Authenticatable implements JWTSubject


public function sponsor(  )
        return $this->belongsTo( User::class, 'sponsor_id', 'id' );
    

请帮我解决这个问题。

谢谢

【问题讨论】:

你能分享更多关于你的模特和他们的关系的信息吗? 【参考方案1】:

一个选项使用子查询:

select id, first_name,
    (select count(*) from mytable t1 where t1.sponsor_id = t.id) sponsored_count
from mytable t

您也可以left join 聚合查询:

select t.id, t.first_name, t1.sponsored_count
from mytable t
left join (
    select sponsor_id, count(*) sponsored_count
    from mytable
    group by sponsor_id
) t1 on t1.sponsor_id = t.id

【讨论】:

非常感谢你能帮助我如何实现它 laravel 雄辩,因为我是新手。【参考方案2】:

首先,编辑您的关系方法以引用赞助商模型,如下所示:

public function sponsor(  )
        return $this->belongsTo( Sponsor::class, 'sponsor_id', 'id' );
    

您可以使用 withCount 静态方法以 eloquent 计算关系。

$users=User::withCount('sponsor')->get();

然后你可以通过调用$users->sponsors_count来获取计数

【讨论】:

以上是关于如何在MySQL中获取具有同一表计数的列的主要内容,如果未能解决你的问题,请参考以下文章

从同一个表mysql存储过程中选择具有不同条件的多个计数

在同一分组中添加具有上述所有行总和的列

如何将约束添加到 MYSQL 中的列仅以保存已存在于同一表的另一列中的值? [复制]

尝试使用 MySQL 创建具有同一表中另一列的季节至今平均值的列

如何在没有主键的情况下从 mySQL 中的两个表中获取不常见的记录

Impala 查询以获取计数聚合函数中使用的列的样本值