mysql中如何串联多行子查询结果?

问题描述 投票:0回答:1

我想用

IN()
函数将子查询的所有匹配数据逗号单独连接起来。但是这个查询通过 join 仅返回一个数据,如果我传递像
IN(1,2,3)
这样的静态 ID,则返回与 ID 对应的所有数据。

示例:

(SELECT GROUP_CONCAT(product_name SEPARATOR ", ") AS pname FROM tbl_product WHERE product_id IN (b.product_id)) as product

返回一条记录:

(SELECT GROUP_CONCAT(product_name SEPARATOR ", ") AS pname FROM tbl_product WHERE product_id IN (1,2,3)) as product

返回3条记录:

while

b.product_id
包含逗号分隔值的列。

这是我的询问:

$this->db->select('b.*, st.description as skin_tone, sp.description as skin_profile, sc.description as skin_concerns, pua.product, pua.producttype, pua.category, ua.description as action, t.description as type,
    (SELECT GROUP_CONCAT(product_name SEPARATOR ", ") AS pname FROM tbl_product WHERE product_id IN (b.product_id)) as product', false);

$this->db->from('tbl_basket b');
$this->db->join('tbl_skin_tone st', 'st.id = b.skin_tone_id', 'LEFT');
$this->db->join('tbl_skin_profile sp', 'sp.id = b.skin_profile_id', 'LEFT');
$this->db->join('tbl_skin_concerns sc', 'sc.id = b.skin_concern_id', 'LEFT');       
$this->db->join('tbl_product_updated_all pua', 'pua.id = b.product_id', 'LEFT');
$this->db->join('tbl_user_action ua', 'ua.id = b.action_id', 'LEFT');
$this->db->join('tbl_type t', 't.id = b.type_id', 'LEFT');  
$this->db->where('b.customer_id', $reminderProductID);  

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

return $query->result_array();

请告诉我我哪里做错了。

php sql mysql codeigniter
1个回答
2
投票

这个表情:

SELECT GROUP_CONCAT(product_name SEPARATOR ", ") AS pname
FROM tbl_product
WHERE product_id IN (b.product_id)) as product

没有达到您的预期。当

product_id
是字符串时,例如
'1,2,3'
,那么它是 in 列表中的 一个 元素,而不是三个。

解决您的问题的正确方法是不要将列表存储为逗号分隔的列表。 SQL 具有用于存储列表的出色数据结构;它被称为“表”,而不是“字符串”。此外,将数字存储为字符串是一个非常糟糕的主意。

当您正在找出正确的数据结构时,有一个解决方法。这就是函数

find_in_set()
:

WHERE find_in_set(product_id, b.product_id) as product
© www.soinside.com 2019 - 2024. All rights reserved.