2014-01-15 42 views
3

我试图建立一个多品种支持产品的eshop,所以每当我从<select>,我serialize()选择一个特定的类别,并将它们保存到数据库。如何使用一个序列化数据连接两列?

所以现在,我想输出的所有DB DATAS我所需要的连接表,试图连接两个表:CATEGORIESECOMMERCE_PRODUCTSapp/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代表产品制造商也存储在categories表中。

为了澄清,在第一个JOIN中调用的ecommerce_products.catid被序列化,我想知道如何在执行JOIN之前将其反序列化?

回答

3

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

2,4,5,10,... 

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

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 
+0

感谢您的解决方案!我会尝试将这个方法应用到我的数据库结构中,并会给你我的反馈。 – aspirinemaga

+0

我正在研究它,需要几天时间才能成功地将您的解决方案与其他功能混合使用。请不要删除你的答案,谢谢 – aspirinemaga

+2

伟大,伟大,伟大!我今天很幸运,我很长时间以来一直在寻找这个解决方案。非常感谢.. :-) – Rajesh

1

我认为在这种情况下是序列化ecommerce_products.catid的糟糕解决方案,稍后将用于连接表。未知的,因为将来会使用序列化数据,可能会出现什么问题:看起来,您已经有一个简单的使用连接选择的问题。

因此,尽管不晚,我会建议重新考虑这种方法。我认为,在这个特定时刻,最佳解决方案是添加第三个表categories2ecommerce_products,其中有两个字段:category_idecom_product_cat_id(例如)。它将通过他们的ID将类别与电子商务产品连接(关联)(创建关系表)。

+0

我只是在想这个方法,也许会继续这个方法。感谢您的回复 – aspirinemaga

相关问题