繁体   English   中英

CodeIgniter GROUP_CONCAT 并加入

[英]CodeIgniter GROUP_CONCAT and join

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

错误编号:1064

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

选择sp_product namesp_product pricesp_product perm_namesp_product description , GROUP_CONCAT(product_type.tName SEPARATOR FROM ( sp_product ) LEFT OUTER JOIN sp_product_type ON sp_product_type . tCategory = sp_product . type WHERE perm_name = 'bacon'

$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(); 

任何想法我做错了什么?

引用不当似乎有问题。

它应该是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(); 

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

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

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' ) 中的字段重命名为不在数据库中的字段名称。 这已经过测试并且正在工作。

无需在组 concat 中将分隔符称为逗号(,),因为默认情况下,它仅在组 concat 中使用逗号(,)

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

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

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

我觉得应该是这样的:

$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();

试试这个,假设您使用 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(); 

看看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");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM