2011-10-06 87 views
3

編輯:PHP MySQL的庫存相似百分比

我刪除了混亂的東西,我想簡化我想要完成的任務:

比方說,約翰有2個籃子,其中1包含1石2個彈子2支,另一個包含2個石頭2支

埃裏克含有3瓶2帽1石 1個籃。

同時傑克有1個籃子,其中包含1根棍子。另外,傑克有石頭某處,但它不在他的籃子裏。

爲了這個查詢的目的,假設我們關注傑克的項目。因此,我們將檢查每個人的籃子,看看哪個籃子看起來幾乎與他所有的物品相同(a),不考慮傑克的物品是否在籃子內;(b)只比較傑克的物品與物品在別人的籃子裏面,不在外面。

搜索這籃子傑克可以匹配最簡單的用他的所有項目無論在哪裏,他的項目是當前時,這將是理想的最終結果是:

事實:

  • 傑克總共有1棒1石

結果:

  • 第一:含有2結石2支約翰的第二筐
  • 第二:含有1石2彈珠2約翰的第一筐棒
  • 第3名:Eric的籃子裏裝着3瓶2次蓋帽1石
+0

這是一個有趣的問題!你能更具體地定義如何計算「相似」?我仍然對如何工作有點模糊。 – Anson

+0

我會在我們的籃子裏拿到所有物品並對它們進行比較。 假設他有3根棍子和2塊石頭。我有一根棍子和一塊石頭。他的籃子中有60%是棍棒,其中40%是石塊。 因此我的公式是(1/3 * 50)+(1/2 * 50),因爲我的棍棒和寶石的分割率爲50%/ 50%。相似度是41.667% 可能有更好的方法來計算相似度,但目前,這是我的想法。 – voldomazta

回答

2

這將做你問什麼一個籃子裏:

SELECT SUM(item.qty/(SELECT sum(qty) total FROM basket WHERE bid = xxx) 
     * 1/all_item.qty) likeness, basket.bid, all_basket.bid all_bid 
FROM basket JOIN item USING (bid) 
    LEFT JOIN 
    (basket all_basket JOIN item all_item USING (bid)) 
    USING (iid) 
WHERE basket.bid = xxx 
GROUP BY basket.bid, all_basket.bid 
ORDER BY likeness DESC 

這或許可以加入這個給用戶表做他所有的籃子一次。然後將其包裝在另一個查詢中以找到最佳匹配。

試試這個,並告訴我它是否有效。如果是這樣,我會明天看看我能不能做那部分。

+0

就我個人而言,我討厭'使用'反模式,但是如果你的嵌套連接語法是故意強制連接按照列出的順序發生的,那就是靈感,+1 – Johan

0

雖然我不確定是否有一種簡單的方法來計算使用SQL的籃子相似度,但我認爲您只是試圖產品推薦。

您可以根據當前購物籃制定產品推薦的查詢。您可以通過以下方式執行此操作:

  1. 查找包含當前客戶籃中至少一項的任何籃子。
  2. 將結果限制爲屬於同一類別的產品。

可以取得與下面的查詢相應的信息:

SELECT b1.basket_id, b1.product_id, b1.quantity, p1.product_category FROM baskets b1 
    INNER JOIN products p1 ON p1.product_id = b1.product_id 
    WHERE b1.product_id IN 
    (
     SELECT b2.product_id FROM baskets b2 
      INNER JOIN products p2 ON p2.product_id = b2.product_id 
      WHERE b2.basket_id = $basket 
      AND p2.product_category = p1.product_category 
    ) 
    AND b1.basket_id != $basket; 

這將在所有其他籃子共有至少回到籃下ID,產品ID,數量和產品類別ID的所有項目一個產品與您選擇的籃子。它還會過濾結果,以便建議的產品始終與來源產品處於同一類別。

這裏有一個例子:

baskets table: 
basket_id | product_id | quantity 
1,   2,   1 
1,   1,   2 
1,   3,   5 
2,   5,   1 
2,   6,   1 
3,   1,   1 
3,   2,   1 
3,   4,   1 

products table: 
product_id | product_name | product_price | product_category 
1,   'cat1 prod1', 14,    1 
2,   'cat1 prod2', 1.5    1 
3,   'cat1 prod3', 2,    1 
4,   'cat2 prod1', 22,    2 
5,   'cat2 prod2', 6,    2 
6,   'cat2 prod3', 45,    2 
7,   'cat3 prod1', 24,    3 
8,   'cat3 prod2', 55.4,   3 
9,   'cat3 prod3', 22,    3 

result of query: 
basket_id | product_id | quantity | product_category 
3,   1,   1,   1 
3,   2,   1,   1 

希望這是一些對你有用的。

+0

我建議你用''購物籃替換'$ basket' ''或者您可能會遭受可能的SQL注入問題和語法錯誤,因爲'mysql_real_escape_string()'不適用於不帶引號的'$ vars'。 – Johan

+0

非常真實,儘管我只是將變量作爲一個標記包含在內,以代替他想要的任何值。我並不打算成爲一個鐵桿解決方案。我通常使用PDO,所以我會放一個?在那裏,但我想這可能會讓不熟悉這種參數化查詢的人感到困惑。 – Polynomial

+0

尤佳。在處理新手時,不要把人引向危險的領域是非常重要的。最好把它們和PDO混淆起來,而不是讓它們都放心和舒適,同時讓它們爲一個網站開闢一個網站。一個到'[php] + [pdo]'的簡單鏈接應該可以做到。 – Johan