汇总多行的更优雅方式?

时间:2012-03-09 09:41:37

标签: codeigniter

我是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创建)并在那里进行一些处理......但它看起来真的是CLUNKY。

有更好的解决方案吗?

1 个答案:

答案 0 :(得分:0)

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

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

看起来很奇怪 - 你为什么不选择tblstars(加入tblclients),然后使用应用程序逻辑来按c_name / {{1}索引日期}?

id