我想用
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();
请告诉我我哪里做错了。
这个表情:
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