回答

收藏

如何将两个列与一个序列化数据联接在一起?

技术问答 技术问答 206 人阅读 | 0 人回复 | 2023-09-12

我正在尝试建立一个具有对产品的多类别支持的eshop,所以每当我从中选择特定的类别时,,我都会将serialize()它们存储在数据库中。
, W2 f- \. B1 C1 Z所以现在,我想输出所有DB1 k% [; D" t4 X. t
DATAS我需要的连接表试图连接两个表:CATEGORIES和ECOMMERCE_PRODUCTS我app/models/ecommerce_model.php:
" [8 x0 y) c6 N  \& Y+ O$this->db    ->select       ecommerce_products.id,           categories.id AS catid,           categories.title AS categories,           ecommerce_products.manid,           ecommerce_products.name         ->join('categories','ecommerce_products.catid = categories.id','left     ->join('categories as man','ecommerce_products.manid = man.id','left     $this->db->get('ecommerce_products')->result();第一个JOIN代表产品类别,第二个JOIN它们也存储在代表产品制造商的产品中categories表中。
% P0 q# t! R0 A因此要澄清ecommerce_products.catid第一,第一JOIN内部调用是序列化的,我想知道它在执行JOIN以前怎么反序列化?
1 ?$ E4 Q( E* X& D                                                               
0 K" ?. r% z6 P, i    解决方案:                                                                + |% ]( ^8 f/ K
                                                                MySQL不知道是什么PHP序列化。您可以使用以下格式来分类类别ID存储为字符串:
( B4 G9 }8 K$ z8 k+ L* L2,4,5,10,...然后,结合使用SUBSTRING_INDEX()和FIND_IN_SET()
. h; A# e& o) b, `3 c8 UMySQL函数来检查categories.idin的存在ecommerce_products.catid:( L6 r7 y; H8 g) y9 X
SUBSTRING_INDEX(    SUBSTRING_INDEX(ecommerce_products.catid,     FIND_IN_SET(categories.id,ecommerce_products.catid)),',',-1)为了记录每个产品的类别标题,我们需要根据GROUP_CONCAT()功能串联标题,最终查询如下:* U: h* x5 m5 m, d" Q* U
SELECT p.id,      p.catid       GROUP_CONCAT(cat.title ORDER BY cat.id SEPARATOR '|') as 'categories       p.manid,      p.nameFROM ecommerce_products AS pLEFT JOIN categories AS cat    ON cat.id = SUBSTRING_INDEX(SUBSTRING_INDEX(p.catid,',',FIND_IN_SET(cat.id,p.catid)),',',-1)-- more query...GROUP BY p.id; -- Group the result to concatenate the categories titles你可能需要使用这种方法$this->db->query();手动操作查询的方法。, o- o. C# G, {5 L% g) [
注意:2 x1 B! V4 a: i
作为替代品,您可以使用以下内容forON语句:. N& r* _. P* F* M3 h$ U5 |& N, G3 q
LEFT JOIN categories AS cat    ON p.catid REGEXP CONCAT(cat.id,测试用例这是我在 SQLFiddle    上的/ i5 E% L5 o7 f
测试用例    :" h4 L- o% D* A4 n
SELECT p.id,      p.name,      GROUP_CONCAT(c.title ORDER BY c.id SEPARATOR '|') as 'categories'FROM products as pJOIN categories as c  ON c.id = SUBSTRING_INDEX(SUBSTRING_INDEX(p.cat_id,',',FIND_IN_SET(c.id,p.cat_id))-1)GROUP BY p.id;结果:ID    NAME          CATEGORIES--    ---------     -----------1     Product 1     Cat 1|Cat 32      Product 2      Cat 2|Cat 43      Product 3     Cat 1|Cat 44     Product 4     Cat 2|Cat 3
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则