Codeigniter Active Record / MySQL Query - group_by只返回一行

时间:2013-07-13 20:35:44

标签: mysql codeigniter activerecord 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'和'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  |
--------------------------------------------------------

1 个答案:

答案 0 :(得分:0)

更新:根据您的评论和更新的问题,您的基本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_id WHERE子句。因此GROUP BY services.service_idORDER BY services.service_id毫无意义。只有当您想要将值打包到分隔的字符串中并返回唯一的行时,GROUP_BY才有意义。
  2. 您未使用LIMIT因此SQL_CALC_FOUND_ROWS也毫无意义。
  3. 据说你查询可能看起来像

    $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 演示