|
我正在尝试建立一个具有对产品的多类别支持的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 |
|