表格怎么合并两列数据php,php-如何用一个序列化数据加入两列?

我正在尝试建立一个对产品提供多类别支持的eshop,因此每当我从< select>中选择特定类别时,我都会对其进行序列化()并将其保存到数据库中.

因此,现在,我想通过尝试连接两个表(我的app / models / ecommerce_model.php中的CATEGORIES和ECOMMERCE_PRODUCTS)输出需要的所有db数据的JOINed表:

$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代表产品制造商,它们也存储在类别表中.

因此,澄清一下,第一个JOIN内部调用的ecommerce_products.catid已序列化,我想知道在执行JOIN之前如何对其进行反序列化吗?

解决方法:

MySQL不知道什么是PHP序列化.您可以使用以下格式将类别的ID存储为字符串:

2,4,5,10,...

然后,结合使用SUBSTRING_INDEX()和FIND_IN_SET() MySQL函数来检查ecommerce_products.catid中category.id的存在:

SUBSTRING_INDEX(

SUBSTRING_INDEX(ecommerce_products.catid,

',',

FIND_IN_SET(categories.id, ecommerce_products.catid)

), ',', -1)

要为每个产品记录选择类别标题,我们需要通过GROUP_CONCAT()函数将标题连接起来,因此最终查询将如下所示:

SELECT p.id,

p.catid

GROUP_CONCAT(cat.title ORDER BY cat.id SEPARATOR '|') as 'categories',

p.manid,

p.name

FROM ecommerce_products AS p

LEFT 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();方法来手动运行查询.

注意:

或者,您可以对ON语句使用以下内容:

LEFT JOIN categories AS cat

ON p.catid REGEXP CONCAT('[,]{0,1}', cat.id, '[,]{0,1}')

测试用例

这是我在SQLFiddle上的测试用例:

SELECT p.id,

p.name,

GROUP_CONCAT(c.title ORDER BY c.id SEPARATOR '|') as 'categories'

FROM products as p

JOIN 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 3

2 Product 2 Cat 2|Cat 4

3 Product 3 Cat 1|Cat 4

4 Product 4 Cat 2|Cat 3

标签:activerecord,codeigniter,sql,mysql,php

来源: https://codeday.me/bug/20191030/1964319.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值