[英]CodeIgniter GROUP_CONCAT and join
我试图找到一种方法将这两个表连接在一起,我能够做到,但是如果找到多个匹配的值,它会再次显示产品表中的所有内容。 现在我试图将 MySQL group_concat 一起使用,以便能够在数组的一个字段中列出所有 tName,但我一直收到 MySQL 错误:
错误编号:1064
您的 SQL 语法有错误; 检查与您的 MySQL 服务器版本相对应的手册,以获取在第 2 行的“FROM (
sp_product
) LEFT OUTER JOINsp_product_type
ONsp_product_type
.`tCat”附近使用的正确语法选择
sp_product
。name
,sp_product
。price
,sp_product
。perm_name
,sp_product
。description
, GROUP_CONCAT(product_type.tName SEPARATOR FROM (sp_product
) LEFT OUTER JOINsp_product_type
ONsp_product_type
.tCategory
=sp_product
.type
WHEREperm_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.