2012-03-09 41 views
3

我是新來的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創建),並在那兒做一些處理...但它似乎真的沉悶。

有沒有更好的解決方案?

+0

我看不出有什麼問題。另一種方法是不使用'GROUP_CONCAT'並使用PHP來檢查迭代中'id'的變化。 – Mischa 2012-03-09 10:04:12

+0

感謝您的回覆。我雖然也許我會,與「滾動」的部分在某個地方是一個騙局,但它似乎不是。乾杯。 – user1106252 2012-03-09 14:14:58

+0

不客氣。我想這也取決於你的數據集的大小。使用'GROUP_CONCAT'可能會降低性能。我不是MySQL專家。如果您將MySQL標籤添加到您的問題中,您可能會收到有關該問題的反饋。如果您還添加了PHP標籤,您可能會收到更多反饋。 – Mischa 2012-03-09 14:22:14

回答

0

如果您想要在單個查詢中獲取所有數據(每行的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; 
相關問題