To be Developer/DataBase
[ORACLE / SQL] Matching Query 사람간 유사한답변 한사람 이어주기
EdgarHan
2017. 5. 17. 10:09
Scenario: 이번 프로젝트를 할때 설문조사를 실행하여 사람과 사람간의 유사한답변을 찾은사람끼리 매칭시켜주는 기능을 만들고자 했었다.
Solutions: 맨처음에는 주관식을 하여 단어간의 유사성을 찾아 매칭시켜줄려고 했지만, 객관식으로 하는것이 더 깔끔 할 것같아서 바꿈
1.테이블 구조(간단함)
- CREATE TABLE MBER_TQ
- (
- TQ_IDX NUMBER PRIMARY KEY,
- MBER_EMAIL varchar2(50) NULL,
- TQ_QUESTION NUMBER NULL,
- TQ_ANSWER NUMBER NULL,
- DEL_FLAG varchar2(5) DEFAULT 'N'
- );
2.설문조사를 시작하자마자 수행되는 쿼리
- --같은사용자가 재 설문조사를할경우 Init해주는 쿼리(시작하기전에 한번 실행)
- UPDATE MBER_TQ
- SET DEL_FLAG = 'Y'
- WHERE MBER_EMAIL = '1@gmail.com';
- --답변을 선택할때마다 동적으로 실행되는 인서트쿼리
- INSERT INTO MBER_TQ VALUES(SEQ_MBER_TQ_IDX.NEXTVAL ,'97@gmail.com' ,1,2,'N');
- INSERT INTO MBER_TQ VALUES(SEQ_MBER_TQ_IDX.NEXTVAL ,'98@gmail.com' ,1,1,'N');
- INSERT INTO MBER_TQ VALUES(SEQ_MBER_TQ_IDX.NEXTVAL ,'99@gmail.com' ,1,3,'N');
- INSERT INTO MBER_TQ VALUES(SEQ_MBER_TQ_IDX.NEXTVAL ,'100@gmail.com' ,1,4,'N');
- INSERT INTO MBER_TQ VALUES(SEQ_MBER_TQ_IDX.NEXTVAL ,'101@gmail.com' ,1,2,'N');
3.핵심쿼리(내가 선택한 답변을 db에서 다른사람이 선택한 답변과 비교하여 상위 4명을 잘라서 보여줌)
- SELECT MBER_NAME, MBER_IMG, MBER_INFO_IDX, MBER_SKILL, MBER_INTRODUCE, MI.MBER_EMAIL, SCORE
- FROM(SELECT MBER_EMAIL, SCORE
- FROM
- (SELECT A.MBER_EMAIL ,SUM(B.SCORE) AS SCORE
- FROM MBER_TQ A JOIN
- (SELECT MBER_EMAIL, TQ_QUESTION, TQ_ANSWER, 1 SCORE
- FROM MBER_TQ
- WHERE MBER_EMAIL='a@GMAIL.COM'
- AND DEL_FLAG != 'Y') B
- ON A.TQ_QUESTION = B.TQ_QUESTION
- AND A.TQ_ANSWER = B.TQ_ANSWER
- AND A.MBER_EMAIL != 'a@GMAIL.COM'
- AND DEL_FLAG != 'Y'
- AND SCORE IS NOT NULL
- GROUP BY A.MBER_EMAIL
- ORDER BY SUM(B.SCORE) DESC)
- WHERE ROWNUM <= 4) GENIE, MBER_INFO MI ,MBER
- WHERE GENIE.MBER_EMAIL = MI.MBER_EMAIL
- AND MBER.MBER_EMAIL = MI.MBER_EMAIL
- ORDER BY GENIE.SCORE DESC;