我正在尝试建立一个具有对产品的多类别支持的eshop,因此每当我从中选择特定类别时<select>,我都会将serialize()它们保存到数据库中。
<select>
serialize()
所以现在,我想输出的所有DB DATAS我所需要的连接表,试图连接两个表:CATEGORIES和ECOMMERCE_PRODUCTS我app/models/ecommerce_model.php:
CATEGORIES
ECOMMERCE_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表中。
categories
因此要澄清ecommerce_products.catid一下,第一个JOIN内部调用的是序列化的,我想知道在执行JOIN之前如何反序列化它吗?
ecommerce_products.catid
MySQL不知道什么是PHP序列化。您可以使用以下格式将类别的ID存储为字符串:
2,4,5,10,...
然后,结合使用SUBSTRING_INDEX()和FIND_IN_SET() MySQL函数来检查categories.idin的存在ecommerce_products.catid:
categories.id
SUBSTRING_INDEX( SUBSTRING_INDEX(ecommerce_products.catid, ',', FIND_IN_SET(categories.id, ecommerce_products.catid) ), ',', -1)
要为每个产品记录选择类别标题,我们需要按GROUP_CONCAT()功能串联标题,因此最终查询将如下所示:
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();方法来手动运行查询。
$this->db->query();
注意: 作为替代,您可以使用以下forON语句:
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