我有数千个用户生成的项目愿望清单
表格类似于
collectionId | itemdId | user_id
-----------------------------------
123 | 2345 | 1
123 | 3465 | 1
123 | 876 | 1 // <---
123 | 567 | 1
123 | 980 | 1 // <---
777 | 980 | 2 // <---
777 | 332 | 2
777 | 3465 | 2
777 | 876 | 2 // <---
777 | 678 | 2
777 | 567 | 2
... ... ...
etc..
你看到第876和980项,包含在两个系列中(777和123)所以它们是一对受欢迎的情侣/一对
所以说我访问了项目876的页面 我想向我的用户展示一个非常常见的与之相关的项目,它是项目980(当然这是基于用户和品味)
在PHP中想一想亚马逊做了什么,如果你看到我想要的白色iphone 建议你一个粉红色的iPhone手机套,因为很多其他用户 建议/赞成与白色iphone一起
我可能会做一些像伪代码一样循环的东西
for total number of collection:
select all item from collection 1
select all item from collection 2
do array_interesct (c1,c2)
store the matching items
repeat...
select all item from collection 2
do array_interesct (c1,c3)
store the matching items
repeat...
...then elect all item from collection 2 and repeat all the iterations..
但我想知道这是否只能通过MYSQL实现
答案 0 :(得分:2)
从获取包含所选项目的所有集合的查询开始:
SELECT collectionId
FROM wishLists
WHERE itemId = 876
由此,您希望获得这些集合中的所有其他itemIds。
SELECT itemId
FROM wishLists
WHERE collectionId IN (above query)
AND itemId != 876
这可以重写为连接:
SELECT a.itemId
FROM wishLists AS a
JOIN wishLists AS b ON a.collectionId = b.collectionId
WHERE a.itemId != 876 AND b.itemId = 876
现在你可以计算重复次数来找到最常见的那些:
SELECT a.itemId
FROM wishLists AS a
JOIN wishLists AS b ON a.collectionId = b.collectionId
WHERE a.itemId != 876 AND b.itemId = 876
GROUP BY a.itemId
ORDER BY COUNT(*) DESC
在末尾添加LIMIT n
子句以显示前n项。