编辑:
我删除了令人困惑的东西,我想简化我想要完成的事情:
让我们说John有2个篮子,其中1个包含 1 stone , 2个弹珠和 2个棍子,另一个包含 2颗石头和 2支。
Eric有1个篮子,其中包含 3瓶, 2瓶和 1石。同时杰克有一个包含 1棒的篮子。另外,杰克在某个地方一块石头但是它还没有进入他的篮子里。
出于此查询的目的,我们假设我们专注于杰克的项目。因此,我们会检查每个人的篮子,看看哪个篮子与他总体上的所有物品几乎相同(a)而不考虑Jack的物品是否在篮子里面,(b)只与Jack的物品相比较在别人的篮子里面,不在外面。
这将是一个理想的最终结果,当搜索哪个篮子杰克可以匹配最简单的所有项目,无论他的项目目前在哪里:
事实:
结果:
答案 0 :(得分: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
可能可以将此连接到users表以立即执行所有篮子。然后将其包装在另一个查询中以找到最佳匹配。
首先尝试一下,让我知道它是否有效。如果确实如此,我明天是否能做到这一点。
答案 1 :(得分:0)
虽然我不确定使用SQL计算篮子相似度的简单方法,但我认为您只是在尝试提供产品推荐。
您可以根据当前购物篮制定查询以生成产品推荐。您可以通过以下方式执行此操作:
您可以使用以下查询获取相应的信息:
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
希望这对你有用。