2013-07-13 105 views
0

我有以下查詢:笨的Active Record/MySQL查詢 - GROUP_BY導致返回只有一行

$this->db 
    ->select('SQL_CALC_FOUND_ROWS null as rows 
     ,services.* 
     ,service_categories.* 
     ,categories.* 
     ,table4.*', FALSE) 
    ->from('services') 
    ->where('services.user_id', $user_id) 
    ->join('service_categories', 'service_categories.service_id = services.service_id') 
    ->join('categories', 'categories.cat_id= service_categories.cat_id') 
    ->join('table4', 'table4.service_id= services.service_id', 'left') 
    ->group_by('services.service_id') 
    ->order_by('services.service_id', 'DESC'); 

$query = $this->db->get(); 

的表是這樣的:

Table: services 
------------------------------------------------ 
| service_id | other_service_columns | user_id | 
-----------------------------------------------| 
|  23  |  other data  | 14 | 
|  24  |  other data  | 14 | 
------------------------------------------------ 


Table: service_categories 
--------------------------------------- 
| service_cat_id | cat_id | service_id| 
--------------------------------------- 
|  1  | 924 |  23 | 
|  2  | 863 |  23 | 
|  3  | 506 |  24 | 
|  4  | 510 |  24 | 
--------------------------------------- 

Table: categories 
--------------------- 
| cat_id | cat_name | 
--------------------- 
| 924 | cleaning | 
| 863 | washing | 
| 506 | drying | 
| 510 | scrubbing| 
--------------------- 

表4中可能沒有任何結果,所以我正在做一個左連接。但是,當我通過service_id進行分組時,我沒有從「service_categories」和「類別」表中獲取所有相關類別 - 查詢中只返回一行。 group_concat是答案嗎?如果是這樣,我不知道如何使用它來獲得我需要的結果 - 即查詢中返回的所有相關類別。請幫忙!

我需要能夠使用的foreach在它迭代處理查詢的結果,在這樣的觀點產生了一句:

-------------------------------------------------------- 
| Service ID | Other Service Data | Service Categories | 
-------------------------------------------------------- 
|  23  | Data for Service 23| cleaning, washing | 
|  24  | Data for Service 24| drying, scrubbing | 
-------------------------------------------------------- 

回答

0

UPDATE:根據您的意見和更新的問題,您的基本SQL查詢可能看起來像

SELECT s.*, q.categories, t4.* 
    FROM services s LEFT JOIN 
(
    SELECT sc.service_id, GROUP_CONCAT(c.cat_name) categories 
    FROM service_categories sc JOIN categories c 
     ON sc.cat_id= c.cat_id 
    GROUP BY sc.service_id 
) q ON s.service_id = q.service_id LEFT JOIN table4 t4 
    ON s.service_id = t4.service_id 
WHERE s.user_id = ? 

輸出示例:

 
| SERVICE_ID | OTHER_SERVICE_COLUMNS | USER_ID |  CATEGORIES | 
------------------------------------------------------------------- 
|   23 |   other data |  14 | cleaning,washing | 
|   24 |   other data |  14 | drying,scrubbing | 

這裏是SQLFiddle演示

現在可能版本的CI碼

$sql = "SELECT s.*, q.categories, t4.* 
      FROM services s LEFT JOIN 
     (
      SELECT sc.service_id, GROUP_CONCAT(c.cat_name) categories 
      FROM service_categories sc JOIN categories c 
       ON sc.cat_id= c.cat_id 
      GROUP BY sc.service_id 
     ) q ON s.service_id = q.service_id LEFT JOIN table4 t4 
      ON s.service_id = t4.service_id 
     WHERE s.user_id = $user_id"; 
$query = $this->db->query($sql); 
foreach ($query->result() as $row) { 
    ... 
} 

回答原來的問題: 恕我直言有與您的查詢的幾個問題

  1. 你'將結果集限制爲只有service_idWHERE條款。因此GROUP BY services.service_idORDER BY services.service_id是沒有意義的。 GROUP_BY只有在您想將值打包到分隔字符串並取回唯一行時纔有意義。
  2. 您沒有使用LIMIT因此SQL_CALC_FOUND_ROWS也沒有意義。

這就是說,你查詢可能看起來像

$result = $this->db 
    ->select('services.* 
     ,service_categories.* 
     ,categories.* 
     ,table4.*', FALSE) 
    ->from('services') 
    ->join('service_categories', 'service_categories.service_id = services.service_id') 
    ->join('categories', 'categories.cat_id= service_categories.cat_id') 
    ->join('table4', 'table4.service_id= services.service_id', 'left') 
    ->where('services.service_id', $service_id) 
    ->get(); 

這裏是SQLFiddle演示

+0

SQL_CALC_FOUND_ROWS可能是不相關的問題,但我使用它的查詢,因爲我需要計算找到的結果的數量。我使用$ data ['count'] = $ this-> db-> query('SELECT FOUND_ROWS()count;') - > row() - > count返回計數作爲查詢的一部分。但是,如果沒有分組,返回的行數等於service_categories的數量,而不是服務的數量。其實我也在這個問題上犯了一個錯誤 - 道歉 - 應該是 - > where('services.user_id',$ user_id) – whispersan

+0

你可以通過'count($ result)'返回記錄的數量而不需要第二次訪問數據庫。現在你可以編輯你的問題,並根據你提供的樣本數據顯示你想要的輸出是什麼? – peterm

+0

好的謝謝你的幫助,我編輯了問題以顯示所需的輸出 – whispersan