【问题标题】:A more elgant way to roll up multiple rows?一种更优雅的方式来汇总多行?
【发布时间】:2012-03-09 09:41:37
【问题描述】:

我是 codeigniter 的新手(尽管我认为这不是一个专门的 CI 问题)并且在模型中有一个方法可以从两个由 id 连接的表中选择数据。

表 1(tblclients)如下所示:

+----+------------+
+ id + c_name     +
+----+------------+
+ 1  + Joe Bloggs +
+ 2  + Jim Bloggs +
+ 3  + Tim Bloggs +
+----+------------+

表 2 (tblstars) 如下所示:

+----+------------+
+ id + s_date     +
+----+------------+
+ 1  + 27/01/12   +
+ 1  + 15/02/12   +
+ 1  + 18/02/12   +
+ 2  + 03/01/12   +
+ 2  + 11/02/12   +
+ 2  + 15/02/12   +
+ 3  + 01/01/12   +
+ 3  + 19/02/12   +
+----+------------+

我想为 tblclients 中的每一行将连接的数据“汇总”成一行,以便输出,例如:

+----+------------+--------------------------------+
+ id + Name       +   Dates                        +
+----+------------+--------------------------------+
+ 1  + Joe Bloggs + 27/01/12   15/02/12   18/02/12 +
+ 2  + Jim Bloggs + 03/01/12   11/02/12   15/02/12 +
+ 3  + Tim Bloggs + 01/01/12   19/02/12            +
+----+------------+--------------------------------+

现在我已经通过在我的模型中使用以下内容“解决”了这个问题:

    function get_clients_concat()
{   
    $query = $this->db
    ->select('tblclients.id, tblclients.c_name, GROUP_CONCAT(tblstars.s_date SEPARATOR "#") AS star_dates', NULL, FALSE)
    ->join('tblstars', 'tblstars.id = tblclients.id', 'left')
    ->order_by('tblclients.id')
    ->group_by('tblclients.id')
    ->get('tblclients');
    return $query->result();        

}

然后在我的视图中分解数组(由 GROUP_CONCAT 创建)并在那里对其进行一些处理......但它看起来真的很笨重。

有没有更好的解决方案?

【问题讨论】:

  • 我看不出有什么问题。另一种方法是不使用GROUP_CONCAT,而是使用PHP检查迭代中id何时发生变化。
  • 感谢您的回复。我虽然也许我错了,在“卷起”部分的某个地方错过了一个技巧,但似乎没有。干杯。
  • 不客气。我想这也取决于你的数据集的大小。使用GROUP_CONCAT 可能会降低性能。我不是 MySQL 专家。如果您将 MySQL 标签添加到您的问题中,您可能会收到有关此的反馈。如果您还添加 PHP 标记,您可能会得到进一步的反馈。

标签: codeigniter


【解决方案1】:

如果您想在单个查询中获取所有数据(每行的 id 都是唯一的),那么可以——这就是要走的路。

如果您需要对结果进行排序或过滤,当表格填满时,您会遇到性能瓶颈。

这似乎很奇怪——你为什么不从tblstars(加入tblclients)中选择,然后使用应用程序逻辑按c_name/id索引日期?

<?php

// Select data from tables
$data = $this->db
    ->select('tblclients.id, tblclients.c_name, tblstars.s_date')
    ->join('tblclients', 'tblclients.id = tblstars.id')
    ->order_by('tblstars.id')
    ->get('tblstars');

// Index data by client id
// (keeping record of client name and dates array for each)
$clients = array();
foreach ($data->result() as $result)
{
    if (empty($clients[$result->id]))
    {
        $clients[$result->id] = array(
            'name'  => $result->c_name,
            'dates' => array($result->s_date)
        );
    }
    else
    {
        $clients[$result->id]['dates'][] = $result->s_date;
    }
}

return $clients;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-30
    • 1970-01-01
    相关资源
    最近更新 更多