MYSQL / PHP查找与给定项目关联的最常见项目

时间:2016-11-07 21:31:31

标签: php mysql

我有数千个用户生成的项目愿望清单

表格类似于

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(当然这是基于用户和品味)

  

想一想亚马逊做了什么,如果你看到我想要的白色iphone   建议你一个粉红色的iPhone手机套,因为很多其他用户   建议/赞成与白色iphone一起

在PHP中

我可能会做一些像伪代码一样循环的东西

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实现

1 个答案:

答案 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项。