Node.js에서 사용하던 가중치 적용 함수를 SQL Query로 구현 보았습니다.

결론은 로직으로 구현하는것 보다는 Query로 구현하는것이 간단하다 입니다.


------ 테이블 ------ 

t_item 

 

t_weight 

 item_cd

 item_nm

weight 

 weight

a

 장미

2

 1

b

 튤립

5

 2

c

 백합

8

 2

d

 호박꽃

3

 3

e

 무궁화

9

 3


 3

 4

 4

 4

 4


****************** 가중치 함수 - Node.js 구현 ******************

rows1[] = SELECT * FROM t_item 집합

var rownum = weightcheck(rows1[0]); //가중치로 선택된 Row의 번호 Get

var selrow = rows1[0][rownum]; //가중치로 선택된 Row Value


/** -----------------------------------------------------------------

 * 가중치 계산, 배열의 크기를 작게하기 위하여 weight 은 1~9 까지만 사용

 ----------------------------------------------------------------- */

function weightcheck(rows){

var point = 0; //가중치

var beforePoint = 0; //이전 가중치

var totalweightn = totalweigh(rows,'weight');             //가중치 Column

var ran = Math.floor((Math.random() * totalweightn)+1);   //1~가중치총합 사이의 랜덤한수

var i = 0;



//직전 가중치 + 현재 row의 가중치는 Band

for(i=0;i < rows.length;i++){

point = beforePoint + rows[i].adweight; 

if(ran > beforePoint && ran <= point ){

break;

};

beforePoint = point; //현재 위치를 이전 위치로 저장 합니다.

};

return i;

};

/** -----------------------------------------------------------------

 * 총 가중치 계산 (배열,가중치값 이름)

 ------------------------------------------------------------------- */

function totalweigh(list,weightnm){

var total=0; //총 가중치

for(var i = 0;i < list.length;i++){

total = total + list[i].adweight;

}

return total;

};


****************** 가중치 계산 - Query 로 구현 ******************

SELECT C.*

FROM (

SELECT A.* FROM t_item as A INNER JOIN t_weight as B

ON A.weight = B.weight                                       //가중치 숫자만큼 Row 복제

) as C

ORDER BY rand() LIMIT 1;                                         //복제된 Row 중 랜덤하게 하나의 Row를 반환



Node.js 에서 코드로 처리하는 것 보다 RDB에서 처리하는것이 더 깔끔합니다.


안드로이드용 바로가기APP https://goo.gl/LjcQgi -- 바로가기G




'Node.js' 카테고리의 다른 글

Node.js Windows 10 에서 jsdom 3 설치 오류 해결  (0) 2015.09.05
node.js로 GooglePlay Crawling  (0) 2015.08.31
시작합니다  (0) 2015.08.07

+ Recent posts