CodeIgniter GROUP_CONCAT并加入

时间:2012-02-17 03:57:12

标签: php mysql codeigniter

我试图找到一种方法将这两个表连接在一起,这是我能够做到的,但如果找到多个匹配的值,它会再次显示产品表中的所有内容。现在我试图将MySQL group_concat一起使用,以便能够在数组中的一个字段中列出所有tName但是我一直在使用MySQL收到错误:

  

错误号码:1064

     

您的SQL语法有错误;查看与您的MySQL服务器版本相对应的手册,以便在'FROM(sp_product)LEFT OUTER JOIN sp_product_type附近sp_product_type附近使用正确的语法。在第2行使用`tCat'

     

选择sp_productnamesp_productpricesp_productperm_namesp_product。{{1} },GROUP_CONCAT(product_type.tName SEPARATOR FROM(description)LEFT OUTER JOIN sp_product ON sp_product_typesp_product_type = tCategorysp_product WHERE { {1}} ='培根'

type

任何想法我做错了什么?

8 个答案:

答案 0 :(得分:7)

似乎有不正确的引号问题。

应为GROUP_CONCAT(product_type.tName SEPARATOR ",")

尝试以下:

$this->db->select('product.name, product.price, product.perm_name, product.description, GROUP_CONCAT(product_type.tName SEPARATOR ",") as product_type.tName'); 
    $this->db->from('product');
    $this->db->where('perm_name', $this->uri->segment(2));
    $this->db->join('product_type', 'product_type.tCategory = product.type', 'LEFT OUTER');
    $query = $this->db->get(); 

答案 1 :(得分:2)

您应该使用false作为选择中的第二个参数来跳过转义:

$this->db->select('GROUP_CONCAT(product_type.tName SEPARATOR ",") as product_type.tName', false);

答案 2 :(得分:1)

无需在group concat中提及分隔符作为逗号(,),因为默认情况下它只会在组concat中使用逗号(,)

答案 3 :(得分:0)

查看GROUP_CONCAT文档:

改变这个:

GROUP_CONCAT(product_type.tName SEPARATOR

对此:

GROUP_CONCAT(product_type.tName SEPARATOR ', ')

您正在混合'

'product.name,product.price,product.perm_name,product.description,GROUP_CONCAT(product_type.tName SEPARATOR',')as product_type.tName');

试试这个:

"product.name, product.price, product.perm_name, product.description, GROUP_CONCAT(product_type.tName SEPARATOR ',') as product_type.tName");

答案 4 :(得分:0)

user319198开局不错,但他的回答不起作用。 工作答案如下。

$this->db->select('product.name, product.price, product.perm_name, product.description, GROUP_CONCAT(product_type.tName SEPARATOR) as tName'); 
    $this->db->from('product');
    $this->db->where('perm_name', $this->uri->segment(2));
    $this->db->join('product_type', 'product_type.tCategory = product.type', 'LEFT OUTER');
    $query = $this->db->get(); 

注意我删除了SEPARATOR ","并将(as product_type.tName')中的字段重命名为不在数据库中的字段名称。 已经过测试并且正在运行。

答案 5 :(得分:0)

#Claremont,#user319198,#FredTheLover,#Mosty Mostacho 在使用CodeIgniter开发任何项目时请记住,要在codeigniter的select查询中选择多个数据或使用复合语句,您需要定义select查询的第二个参数。像

$ this-> db-> select('(SELECT SUM(company.amount)FROM payments WHERE company.invoice_id = 4')AS amount_paid', FALSE );

由于 $ this-> db-> select()接受可选的第二个参数。如果将其设置为FALSE,CodeIgniter将不会尝试使用反引号来保护您的字段或表名称。如果您需要复合选择语句,这非常有用。

答案 6 :(得分:0)

我认为应该是这样的:

$this->db->select('product.name, product.price, product.perm_name, product.description')
   ->select(' GROUP_CONCAT(product_type.tName SEPARATOR ",") as product_type.tName', FALSE); 
$this->db->from('product');
$this->db->where('perm_name', $this->uri->segment(2));
$this->db->join('product_type', 'product_type.tCategory = product.type', 'LEFT OUTER');
$query = $this->db->get();

答案 7 :(得分:0)

尝试此操作,假设您使用id进行排序,请使用GROUP_BY而不是ORDER_BY并也使用DISTINCT ..这将起作用

 $this->db->group_by("product.id","ASC");
$this->db->select('product.name, product.price, product.perm_name, product.description, GROUP_CONCAT(DISTINCT product_type.tName SEPARATOR ",") as tName',FALSE); 
$this->db->from('product');
$this->db->where('perm_name', $this->uri->segment(2));
$this->db->join('product_type', 'product_type.tCategory = product.type', 'LEFT OUTER');
$query = $this->db->get();