php - 如何用一个序列化数据连接两列?

标签 php mysql sql codeigniter activerecord

我正在尝试构建一个支持多类别产品的网店,因此每当我从 <select> 中选择特定类别时, 我 serialize()并将它们保存到数据库中。

所以现在,我想通过尝试连接两个表来输出包含我需要的所有数据库数据的连接表:CATEGORIESECOMMERCE_PRODUCTS在我的 app/models/ecommerce_model.php :

$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中。表。

所以澄清一下,ecommerce_products.catid在第一个 JOIN 中调用的是序列化的,我想知道如何在执行 JOIN 之前反序列化它?

最佳答案

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

2,4,5,10,...

然后,使用 SUBSTRING_INDEX() 的组合和 FIND_IN_SET() MySQL 函数检查 ecommerce_products.catid 中是否存在 categories.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

关于php - 如何用一个序列化数据连接两列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21134904/

相关文章:

MySQL查询获取平均数据消耗

mysql - 更新ID列值而无需自动递增

SQL - 从两个表中按列排序

php - 非加密用途的最快哈希?

php - 如何禁用php中命令的输出

php - 通过单击链接或从复选框下拉列表中选择 "select-all",JQuery/Javascript 全选

mysql - 在mysql中show create table后出现语法错误

MySQL : Initialize mySql variable inside a query

mysql - 存储过程和外键检查

php - 电子商务网站上的嵌套模型菜单