为使用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
等等...
但得到了同样不正确的结果。我的任何其他想法看起来比以前更愚蠢。
因此,如果他们搜索类似的产品,我需要获得一些需要获得新产品通知的用户...我认为应该有更简单的解决方案,但无法找到它。
任何想法......?
答案 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
);