2015-01-13 2 views
4

SQL 사용자를위한 추천 제품 찾기SQL을 가진 사용자를위한 추천 제품 찾기

제품 카탈로그가 있습니다. 예를 들어

: 이름 : 제품 1 도시 : 정수 제품 기능 (테이블 도시에서 도시의 아이디) : 정수의 배열 (각 정수 - 테이블 기능의 제품 기능의 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에 추가

제품 기능은

사용자 검색과 일치하는 경우이 제품 에 대해 통지해야하는 사용자를 찾을 필요

예 : 신제품. 나는 'IN'연산자 와 SQL 쿼리를 사용하여 알림을 필요로 사용자의 배열을 얻기 위해 노력했습니다

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) 

:

id  name   city 
2  Product 2(new) 5 

product_features: 
id  product_id feature_id 
5  2   3 
6  2   5 

일부 사용자

이 제품에 대한

표 user_searches을 통보해야한다 하지만 사용자가 하나 이상의 기능을 검색 할 때 작업이 해결되지 않습니다.

예 :

IN 363,210
product_features user_searched 
3,5     3 

3, 5가 - 물론 그것은 또한 내가

을 작동하지 않습니다 ....

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

3 , 5, 10, 20 IN 3, 5, 7, 2를 작동 ... 모든 사용자가 다른 테이블 (행당 1 기능 ID)

user_id  feature_id 
10   3 
10   5 
11   3 

기타 필요에 저장 기능을 시도한

,

하지만 같은 잘못된 결과가 있습니다. 저의 다른 모든 아이디어는 이전보다 더 어리석은 것처럼 보입니다.

비슷한 제품을 검색하는 경우 신제품에 대한 알림을 받아야하는 사용자를 필요로합니다 ... 더 간단한 솔루션이 있어야하지만 찾을 수는 없다고 생각합니다.

아이디어가 있습니까?

+2

어떤 DBMS를 사용하고 있습니까? 포스트그레스? 신탁? –

+0

MySQL을 사용하고 있습니다 –

+0

user_searches에 각 사용자 당 하나의 행만 있습니까? 또는 그것의 역사 테이블처럼? –

답변

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 
); 
관련 문제