为使用SQL的用户查找推荐的产品

时间:2015-01-13 12:14:59

标签: mysql sql

为使用SQL的用户查找推荐产品

我有产品目录。

举个例子: 名称:产品1 城市:整数(表城市中的城市ID) 产品特性:整数数组(每个整数 - 表特征中产品特征的id)

Table products:
id      name        city
1       Product 1   5

Table product_features:
id      product_id  feature_id
1       1           2
2       1           3
3       1           5

Table features:
id      title
2       Mobile
3       Fast
5       External power source

某些注册用户(id = 10)在网站上执行搜索。用户搜索(使用复选框或其他任何内容)

示例:来自城市5的产品,具有功能3(移动)和5(外部电源)

搜索存储在表user_searches:

id  user_id     search_city     search_features (string - list of needed features divided by ",")
1   10          5               3,5
2   11          5               2
2   12          7               3,5
2   13          5               5

示例:

后来新产品已添加到catalog.I需要找到需要通知此产品的用户 如果产品功能与用户搜索匹配

示例:新产品。

id      name            city
2       Product 2(new)  5

product_features:
id      product_id  feature_id
5       2           3
6       2           5

应该通知某些用户有关此产品的信息

表user_searches:

id  user_id     search_city     search_features
1   10          5               3,5     (should be notified - new product city:5, features:3,5 )
2   11          5               2       (shouldn't be notified - user needs only feature #2)
2   12          7               3,5     (shouldn't be notified - user searched in another city)
2   13          5               5       (should be notified - user needs feature #5 - new product has this feature )

我试图通过“查询”来获取需要使用SQL查询进行通知的一组用户。操作者 但是,当用户搜索多个功能时,它无法解决任务:

示例:

product_features    user_searched
3,5                 3

3 IN 3,5 - 作品

product_features        user_searched
3,5,10,20                   3,5,7,2

3,5,10,20 20 3,5,7,2 ....当然它不能正常工作

此外,我还试图将每个用户需要的功能存储在另一个表中 (每行1个功能ID)

user_id     feature_id
10          3
10          5
11          3

等等...

但得到了同样不正确的结果。我的任何其他想法看起来比以前更愚蠢。

因此,如果他们搜索类似的产品,我需要获得一些需要获得新产品通知的用户...我认为应该有更简单的解决方案,但无法找到它。

任何想法......?

1 个答案:

答案 0 :(得分:0)

好的,让我们看看......您正在查找产品及其功能,以便找到所有搜索

  • 搜索到的城市与产品城市匹配
  • 产品功能中存在所有搜索到的功能

关于第二点,我们选择所有要素匹配并计算它们。对于字符串中元素的匹配,我们使用find_in_set,对于计数,我们从搜索字符串中删除逗号并计算长度的差异。

select distinct user_id
from user_searches
where id in
(
  select s.id
  from products p
  join product_features pf on pf.product_id = p.id
  join user_searches s on find_in_set (pf.feature_id , s.search_features) > 0 and p.city = s.search_city
  where p.id = 2
  group by s.id
  having count(*) = char_length(s.search_features) - char_length(replace(s.search_features,',','')) + 1
);