【问题标题】:Grouping rows which has same value in same column对同一列中具有相同值的行进行分组
【发布时间】:2019-09-10 17:04:26
【问题描述】:

我很难解决这个分组问题。我有一个主表,其中包含 name 列中的名称。还有另一个表通过 belongsTo 关系连接到主表,并包含每个名称的计划。

问题是,在主表中某些名称重复了几次。结构如下图。

|       name        | 
--------------------
|       Mark
|       Mark 
|       Jack
|       Alistair
|       Oliver
|       Jack

如果具有相同的值(名称),我想对行进行分组。同时尽量避免丢失连接表数据。因为每个名称在另一个表中都有自己的计划。

Master::select('name')
        ->groupBy('name')
        ->get();

如果我执行上述操作,我将分组名称。但是这次我当然会丢失连接表的数据。

反正有什么可以实现的,我在这里想要什么。

这是表结构和表之间连接的模型。

主表

    Schema::create('masters', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('name');
        $table->timestamps();
    });

计划表

   Schema::create('plans', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->integer('master_id');
        $table->string('website');
        $table->string('url');
        $table->string('plan_name');
        $table->timestamps();
    }); 

主模型

public $with = ["plan];

public function plan()
{
    return $this->hasMany("App\Plan");
}

计划模型

public function master()
{
    return $this->belongsTo("App\Master");
}

【问题讨论】:

  • 你是用名字连接两个表有没有主键,请提供完整的表结构。
  • 我更新了问题。并提供带有模型的表格结构。 @CHARITRASHRESTHA 请看一下。
  • 您不能使用该名称来连接两个表,因为它们没有唯一值。解释你为什么对名字进行分组。两个Mark是同一个人吗?如果是,那么只需通过主键链接表。无需使用 group by
  • 是的。但每个 Mark 持有不同的计划,在计划表中。我想在这里做什么。将标记分组,并将计划分组...@CHARITRASHRESTHA
  • 作为您的问题,如果每个名称都有不同的计划,您为什么要合并它。如果您想不惜一切代价实现这一目标,您可以在主表中再添加一列,如 name1 计划等

标签: laravel eloquent


【解决方案1】:

Group by 不允许我们选择所有列,因此您可以加入并使用 order by。

DB::table('masters as m')->select(m.*,p.*)
->join('plans as p', 'p.master_id', '=','m.id')
->orderBy('m.name', 'asc')
->orderBy('p.id', 'asc')

【讨论】:

  • 谢谢,但查询有问题。因为它只是返回名称......并且名称重复相同数量的计划
猜你喜欢
  • 2013-02-05
  • 2021-04-20
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 2013-07-28
  • 1970-01-01
相关资源
最近更新 更多