2012-03-09 10 views
3

私はcodeigniterを新しくしましたが(これは排他的なCIの質問ではないと思いますが)、IDで結合された2つのテーブルからデータを選択するモデルのメソッドを持っています。 1(tblclients)は次のようになります複数の行をロールアップするためのより洗練された方法ですか?

表:私はのために1行に参加したデータを 'ロールアップ' したい

+----+------------+ 
+ 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 + 
+----+------------+ 

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

表2(tblstars)このようになります

+----+------------+--------------------------------+ 
+ 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   + 
+----+------------+--------------------------------+ 

今、私は次のiを使って問題を解決しました。 nは私のモデル:

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によって作成された)配列を爆発し、そこにいくつかの処理を行って...しかし、それは本当に不格好ようです。

よりよい解決策はありますか?

+0

私はこれで間違って何も表示されません。代わりに、 'GROUP_CONCAT'を使用しないで、PHPが反復で' id'がいつ変化するかを調べることができます。応答のために – Mischa

+0

ありがとう。私は多分、私は、どこかに 'ロールアップ'部分でトリックを発行したが、そうではないようだ。乾杯。 – user1106252

+0

ようこそ。私はそれがまたあなたのデータセットのサイズに依存すると思います。おそらく 'GROUP_CONCAT'を使用するとパフォーマンスが低下することがあります。私はMySQLの専門家ではありません。質問にMySQLタグを追加すると、そのことに関するフィードバックを得ることができます。また、PHPタグを追加するとさらにフィードバックを得ることができます。 – Mischa

答えて

0

あなたは(各行のidユニークで)単一のクエリですべてのデータを取得したい場合は、[はい - それは移動するための方法です。

あなたは結果をソートやフィルタリングする必要がある場合は、テーブルがいっぱいにするとき、あなたは、パフォーマンスのボトルネックに実行されます。

それはしかし奇妙に思える - なぜあなたは代わりに、その後、c_name/idによってインデックスに日付をアプリケーションロジックを使用します(tblclientsが参加)tblstarsから選択しないのでしょうか?

<?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; 
関連する問題