我正在尝试建立一个具有对产品的多类别支持的eshop,因此每当我从中选择特定类别时<select>
,我都会将serialize()
它们保存到数据库中。
所以现在,我想输出的所有DB DATAS我所需要的连接表,试图连接两个表: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
表中。
因此要澄清一下,ecommerce_products.catid
在第一个JOIN内部调用的是序列化的,我想知道在执行JOIN之前如何反序列化它吗?
MySQL不知道什么是PHP序列化。您可以使用以下格式将类别的ID存储为字符串:
2,4,5,10,...
然后,结合使用SUBSTRING_INDEX()和FIND_IN_SET() MySQL函数来检查categories.id
in的存在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();
方法来手动运行查询。
注意:
作为替代,您可以使用以下forON
语句:
LEFT JOIN categories AS cat
ON p.catid REGEXP CONCAT('[,]{0,1}', cat.id, '[,]{0,1}')
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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句