2014-01-15 44 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

相關問題