Scenario


 스프링으로 개발하다보면, URL 뒤에 /value=hi&id=nana0303

이런식으로 string을 쓰면 서버측에서 HandlerMethodArgumentResolver 등록해놨다면 바로바로 맵에서 Parameter 들을 꺼내 쓸 수 있엇다.

그래서 nodejs에서도 /down/value=hi&id=nana0303  이런식으로 보낸뒤 (나는 당연히 JSON 형식으로 갈꺼라 생각)

router.get('/download/:Params', function(req, res){

req.params.Params.storedname

}

서버에서 이렇게 꺼내쓰면 될 줄알았다. 하지만 params 은 긴 스트링으로 인식 되는 것이었다.



Solution


역시 NodeJs에서는 querystring 이라는 모듈로 제공 하고 있었다.

다음과 같이 쓰면 내가 원하는 결과를 얻을 수 있엇다.

JavaScript 0.26 KB

  1. var querystring = require('querystring');
  2. //file down
  3. router.get('/download/:Params', function(req, res){
  4.     var Params = querystring.parse(req.params.Params);
  5.     console.log("path: %s",JSON.stringify(Params, null, " "));
  6.     res.download('./'+downPath+Params.storedname, Params.originFileName);
  7. });




개요


 스프링을 공부하고 회사에서도 스프링을 다룬다. 그러나 스프링의 심오함은 파도파도 끝이 없는 것 같다. 결정적으로 새로운 언어의 학습 필요성을 느낀 때가 있엇다. 

 Cloud 서비스 및 빅데이터 강의를 연수원에 있을때 들은 적이 있는 데, 강사님과 Back-End와 Front-End에 대해서 이야기를 나눈 적이 있엇다.

 강사님 왈 "한국에서는 백엔드 하면 무조건 JSP,Servlet(스프링) 인데 이미 외국은 노드제이에스 파이썬 장고로 많이 넘어갔어요. 미리미리 준비해두세요." 이런식으로 말씀 하신게 기억이난다.

 그 이후로 nodejs에 대해 조금 스터디를 하고 싶어졌고 하둡 생태계처럼 nodejs도 생태계가 존재하는 것이었다.



그래서 MEAN STACK 이 뭔데??


일단 이 그림부터 보고 가는 게 좋겠다.

 다음과 같은 프로그램의 앞글자를 따서 약자로 쓴 것 인데, 여기서 주목할 만한점은 모든 데이터를 JSON 형태로 주고받는 다는 것이다.

 특히 가히 충격점인점은 DB인데, document 기반(추후 따로 올려야겠다)이다. (몽고디비는 BSON이라고 불리는 바이너리 제이선으로 저장함) 이라는 것이다. RDB의 형식을 파괴하고, 무려 이름은 No-SQL 이다.! 

 물론 오래전부터 주목받았겠지만, 최근에 알게된 나는 JSON으로 프론트에서 디비까지 데이터 변형없이 주고받는게 너무 신선했다. 


장 단점


- 장점

  • 일단 4가지 언어의 공통점은 JavaScript의 뿌리를 가진다. 한 가지 언어로 프론트부터 백단까지 구성!!
  • 굉장히 간단하다. 스프링에 비한다면 가히 폭팔적인 생산성이라고 할 수 있겠다.(코드 짜는 속도가 완전 빠름)
  • 빠르다. 일단 NodeJs가 NonBlocking,Single-Thread를 추구하므로 단점도 있긴 하지만 빠르다. 또한 DOM기반 Jquery에 비해 AngularJS가 훨 씬 빠르다. (물론 어떻게 쓰느냐에 따라 많이 다르다)


- 단점

  • AngularJs는 진입장벽이 확실히 높다. 개인적으로 Jquery는 굉장히 직관적이어서 selector개념만 익힌뒤, 원하는 기능을 왠만하면 다 만들어 낼 수 있엇다. angularjs는 뷰단에서 프레임워크를 구성하기 때문에, 그리고 바인딩 개념때문에 확실히 초반진입장벽이 있다.
  • 한국은 아직까지 JAVA가 대세. 말 그대로 어쩔 수 없는 것 같다. 아직까지 자바공화국 한국에서는 nodejs 기반 프로그래밍은 스타트업에서 쓰이는 정도이다. (나도 자바로 취직을 했다. MEAN stack은 스터디 개념)
  • MongoDb에는 트랜젝션이 없다. 이 부분에서는 좀더 스터디를 하면서 채워나가야 겠다.

결론


 나는 회사원보다는 개발자가 되고싶다. 

언어는 90년대부터 시작해서 굉장히 많이 변해 왔다. 목수나 기술자에게 생산성이 높은 툴이 나온다면, 주저하지 않고 사용법 정도는 익혀놔야 할 것이다. 개발자에게는 더욱 중요 하다. 








Scenario: 페이징을 할경우 밑에 숫자가 뜨게된다. 만약 Ajax를 쓰지 않을 경우, 서버에서 nowPage 라고 선택된 페이지를 넣어주고 클라이언트에서 받아서 if문에 i와 now page를 찍어주면 활성화된 페이지 번호에 class="active" 를 써주면 된다.

그러나 ajax로하면 비동기로 하기때문에(페이지를 분기하는게 아님), 리플부분만 갱신해주고 page 번호는 다시 안찍어주기떄문에 복잡해졌는데, 단순하게 jquery로 클릭한 부분에 대해서 Active하는 방법을 알 수있엇다

(boot strap 기준)


Solution:

jQuery 0.42 KB
  1.     $(function(){
  2.      var pageBtn = $("ul > li");    //  ul > li 이를 pageBtn 으로 칭한다. (클릭이벤트는 li에 적용 된다.)
  3.       pageBtn .find("a").click(function(){   // pageBtn 에 속해 있는  a 찾아 클릭.
  4.       pageBtn .removeClass("active");     // pageBtn 속에 (active) 클래스를 삭제.
  5.       $(this).parent().addClass("active"); // 클릭한 a에 (active)클래스를 넣는다.
  6.      })
  7.     });




ex) Ajax로 페이지가 분기하지 않고 비동기적으로 댓글내용을 페이징함, 밑에 번호들도 클릭시 active되게 바꿔줌.


Scenario:

AWS에서 EC2에 Ubuntu Tomcat7 웹 프로젝트를 올려서 배포를 하려고 했다.

Window 환경에서 배포를 했을때는 잘 돌아갔는데

Ubuntu 환경으로 변하니 오류가 해결이 안되는 것이었다.

Tomcat7 로그를 확인해보니 다음같은 오류가 계속났다.

Error initializing mybatis. Cause:org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: org.apache.ibatis.datasource.DataSourceException: There was an error configuring JndiDataSourceTransactionPool. 

Cause: javax.naming.NamingException: Could not create resource factory instance [Root exception is java.lang.ClassNotFoundException: org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory]



Solutions

Mybatis 쪽에서 오류가 나는건가 하고 내 코드를 열심히 뒤져봤지만,

문제는 

The cause is a issue in the Ubuntu build/package process for Tomcat7. If I understand the issue correctly, Apache builds tomcat-dbcp.jar from binary files, while Ubuntu builds packages only from source. The Ubuntu project ends up needing to change the Java package name, which tends to break things for us poor users. The gory details may be found at the Ubuntu issues list.

The solution I found is to name the data source factory when I define the resource. In one case, I have a META-INF/context.xml file that contains:

이런 이유에서 나는 것 이었다.




factory="org.apache.commons.dbcp.BasicDataSourceFactory" 

단순히 이 한 줄을 context.xml 파일내 Resource에  추가하니 해결 되었다.

이것때문에 몇날을 고생했는지.. ㅠㅠ 

심지어 윈도우로 EC2를 다시구성해야되나 고민했엇다.



Scenario: 클라이언트에서 jsp를 쓸 수 없었고, 세션 정보도 불러올 수 없고, json을 통해서만 서버와 통신 할 수 있었다.

어떤 자료구조를 날리기 위해 List<Map<>>을 Json 으로 바꿔서 날려야만 했고, 받을때도 Json을 받아야만 했다. 엄청 삽질 해서 겨우 해냈다.


Solutions:


1 Json to List<Map<>>


Java 0.42 KB
  1. import org.codehaus.jackson.JsonGenerationException;
  2. import org.codehaus.jackson.map.JsonMappingException;
  3. import org.codehaus.jackson.map.ObjectMapper;
  4.  
  5.     public static String getQuestion() throws JsonGenerationException, JsonMappingException, IOException{
  6.         ObjectMapper objectMapper = new ObjectMapper();
  7.  
  8.         String json = objectMapper.writeValueAsString(questionPool);
  9.  
  10.         System.out.println(json);
  11.        
  12.         return json;
  13.     }



2.List<Map<>>  to Json

Java 0.84 KB
  1.         import org.codehaus.jackson.map.ObjectMapper;
  2.         import org.codehaus.jackson.node.ObjectNode;
  3.         import org.codehaus.jackson.type.TypeReference;

  4.         ObjectNode sessionNode =  (ObjectNode) obj.get(JsonAdaptorObject.TYPE.META);
  5.        
  6.        
  7.         //wow... Tostring 으로 하면 "" 이 붙어서 json list로 인식못함
  8.         // astext 한방에 되버림. tostring을 할경우 더블 쿼테이션이 "" 붙어버려서 망해버렷엇음
  9.         String json = sessionNode.get("quesMapList").asText();
  10.        
  11.         List<HashMap<String, Object>> queList;
  12.         ObjectMapper MAPPER = new ObjectMapper();
  13.  
  14.        
  15.         //""이 붙는 상황에서 고쳤다.
  16.         //astext로 바꾸고 json 형태를 Map List 로 으로 바꿨음
  17.         try {
  18.             System.out.println(">>start");
  19.             queList = MAPPER.readValue(json, new TypeReference<List<HashMap<String, Object>>>() {});
  20.             System.out.println(queList.get(0).get("qNum"));
  21.         } catch (IOException e1) {
  22.             // TODO Auto-generated catch block
  23.             e1.printStackTrace();
  24.         }


+뷰단에서 스트링값으로 온 Jason 값 처리

Sever단에서 String으로 처리해서 Client 단으로 보내야 했기때문에, 다음과 같이 Jason 데이터로 전달되었다.

"[{\"qNum\":\"1\",\"question\":\"아침 9시까지 그린카를  타고 가산동으로\",\"missFlag\":\"true\"},{\"qNum\":\"2\",\"question\":\"목적지 주변에서 미션을  찾으세요\",\"missFlag\":\"ing\"},{\"qNum\":\"3\",\"question\":\"3번쨰 목적지로 가서 QR 코드를 찾아보세요\",\"missFlag\":\"false\"},{\"qNum\":\"4\",\"question\":\"4번째 미션.\",\"missFlag\":\"false\"},{\"qNum\":\"5\",\"question\":\"5번째 미션.\",\"missFlag\":\"false\"}]"


이것을 파싱해주기위해 다음처럼 정규식을 이용해 replace함

JavaScript 0.63 KB
  1. //콜백 펑션임
  2. function(resMIS000){
  3.             //제이선 -> String 시에는 stringify, 제이선 파싱시에는 parse
  4. //          alert(JSON.stringify(resMIS000).replace(/\\/g, ""));
  5.             //Client 단에서 String jason을 파싱해주기 위해서 \과 대괄호를 제거 해주기위해 다음과 같은 정규식적용
  6.             var jsonString = JSON.stringify(resMIS000.body.misList).replace(/\\/g, "").replace(/"\[/g,"\[").replace(/\]"/g,"\]");
  7.             fn_setStatus(JSON.parse(jsonString));
  8. }
  9.  
  10. function fn_setStatus(data) {
  11.     $.each(data, function(idx, val){
  12.         console.log(val.question+" "+idx);
  13.         fn_setTag(idx, val);
  14.     });
  15. }



0. 

윈도우 10을 깔고, 개발환경을 구축하고 있습니다.

이곳저곳 기웃거리며 mysql 수동설치를 찾는데, 16/02/11기준 mysql 최신 버전이라 그런것인지 설치 방법이 조금씩 달랐습니다.

에러들을 처리하고 나서 정리하는 겸 적습니다.


1. 

http://dev.mysql.com/downloads/mysql/

에서 mysql-5.7.10-winx64을 다운

(Windows 10 64 bit을 사용할 경우)




2.

다운 후 원하는 경로에 압축풀기.

전 d:\mysql에 풀었습니다.

폴더 안에 my-default.ini 를 열고 수정합니다.

아래처럼 수정하시고 my.ini로 같은 폴더에 "다른이름으로 저장" 해주세요.

 1) basedir, datadir, port 앞에 주석(#)을 삭제한다.

 2) basedir에는 mysql 압축을 푼 폴더를 작성. (폴더경로는 백슬래시(\)가 아닌 슬래시로(/)

 3) datadir은 mysql압축을 푼 폴더 안에 data폴더

 4) port를 3306

 5) 수정 후, 다른 이름으로 저장 .. 이름을 my.ini로 같은 폴더에 저장합니다.

=>결과



3.

제어판에 환경변수에서 mysql 환경 변수를 등록해줍시다. 윈도우 키 누르시고 환경변수 검색하시면 바로 찾으실 수 있습니다.

전 설치한 경로가 d:\mysql이므로 MYSQL_HOME을 그곳으로 등록하였습니다.




이후, Path에 MYSQL_HOME\bin 폴더를 추가해줍니다.

%MYSQL_HOME%\bin 으로 적어야 합니다. MYSQL_HOME 양 옆에 %를 붙여주세요.

bin 전에는 \넣어주세요.





4.

 관리자 권한으로 명령 프롬프트를 실행합니다.

윈도우 키 누르시고 명령 프롬프트 검색 후 오른쪽 클릭, 관리자 권한으로 실행 혹은

윈도우 + x 키를 누르고 명령 프롬프트(관리자)를 찾으실 수 있습니다.


실행하시고 mysqld --initialize 를 입력


끝나고 명령 프롬프트엔 아무것도 안 나옵니다.

d:\mysql\data 폴더에(my.ini에 datadir로 입력하신 폴더) 데이터가 들어가는 것을 보실 수 있습니다.

(도중 문제가 생기셨다면, data 폴더 안에 내용을 비우고 다시 mysql --initialize 합니다.)


5.

 mysql을 서비스에 등록

"mysql 경로\bin\mysqld" --install

"d:\mysql\bin\mysqld" --install

(혹시나 안되시면, mysqld.exe로 

"d:\mysql\bin\mysqld.exe" --install)

=>path를 등록하였기 때문에 mysqld --install해도 서비스는 등록되지만, 실행하시면 에러가 발생합니다.

서비스 경로가 c드라이브의 mysql이 설치되는 기본 폴더로 지정되있게 되고, 이를 찾지 못해서 에러가 발생합니다.

=>삭제는 --remove입니다.


등록에 성공하였으면, 서비스를 시작해봅시다.

서비스 시작은 꼭 명령 프롬프트가 관리자 권한으로 실행되어야 합니다.

net start mysql

=> 서비스 중지는 net stop mysql


6.

서비스가 잘 시작되면, 루트 계정으로 접속해봅니다.

mysql -u root -p

그럼 또 에러가 납니다.

이유는 잘 모르겠지만, root의 비밀번호가 다르다고 접속할 수 없습니다. 지정한 적 없다 이놈아.

그래서 root의 비밀번호를 바꿔주어야 합니다.

일단, mysql에 root로 비밀번호가 없더라도 접속할 수 있어야 합니다.


 1)

 관리자 권한 명령 프롬프트로, 서비스를 멈춥시다.

 net stop mysql


 2)

 비밀번호를 생략하도록 서비스를 다시 시작합시다.

 mysqld --skip-grant-tables

 입력하면, 해당 명령 프롬프트는 서비스를 실행하느라 사용할 수 없습니다.


 3)

 다른 명령 프롬프트를 열고, mysql에 접속합니다.

 (새로 연 명령 프롬프트)

 mysql -u root -p

 비밀번호 입력하는데 엔터 눌러도 접속됩니다.


 4)

 use mysql;

 update user set authentication_string = password('새로운 비밀번호') where user = 'root'; 

 flush privileges;


 5)

 비밀번호를 생략했던 서버를 종료시키고, 새로운 비밀번호로 접속해봅시다.

 mysqld --skip-grant-tables 를 실행했던 명령 프롬프트를 종료합시다.

 윈도우키 + x 를 눌러 작업관리자(T)를 실행시키고, 백그라운드 프로세스에 있는 mysqld.exe를 종료시킵니다.


 6)

 명령 프롬프트를 관리자 권한으로 실행시키고, mysql 서비스를 시작합니다.

 net start mysql


 7)

 mysql -u root -p

 를 입력하고,

 새로운 비밀번호를 입력하면 접속할 수 있습니다.

 다만 사용하려면 root 비밀번호를 다시 설정하라는 알림이 뜹니다.

 alter user 'root'@'localhost' identified by '새로운 비밀번호';

 를 다시 입력해주셔야 정상적으로 사용 가능합니다.


7. 마치며

제가 한 방법이 정석이 아닐 수 있습니다. 전 제가 헤맨 과정을 그대로 적었습니다. 더 좋은 방법이 있다면, 댓글로 달아주시면 감사하겠습니다.

설치를 완료한 후 기억에 의존하여 적은 것이라, 혹시나 잘못된 점이 있다면 댓글 부탁드립니다.




+추가 database 와 datebase 내의 테이블은 다르므로 

그냥 root 계정내의 테이블을 추가해줬음

구지 new 계정을 추가하고 권한을 부여하고싶다면

http://ourcstory.tistory.com/45

여기서 권한부여 하면됨


+추가

차셋이 

mysql 내에서 

show variables like 'char%' 로 보면

euc-kr 이라서 utf-8 이안들어감 근데 my.ini 파일에서 수정하면 된다는데 때려 죽여도 못찾겠음.

https://stackoverflow.com/questions/22572558/how-to-set-character-set-database-and-collation-database-to-utf8-in-my-ini


이걸 참고해서 데이터베이스 별로 utf-8로 바꿔줄수있음 



추신

원본출처 : http://bombay.tistory.com/3

Scenario: 인터넷의 이미지 파일들을 저장해서, 이 이미지들의 파일명으로 DB의 프로필 파일이름을 변경시키려고 했다.


Solution: 아닛!! 이렇게 쉬운방법이



▲ 그럼 위와 같이 하면 됩니다.
dir /b >list.txt 로 지정을 하면...  자동으로 list.txt 의 파일을 생성해서 파일목록을 딱 넣어 줍니다.
물론, 파일이름은 임의로 지정할수 있습니다. 꼭 list로 해야하는거 아닙니다.^^



Scenario: 

┌ Include nav.jspf (login bar, 여기서 bootstrap jsp,css 갖고있음)

 main body.jsp (list)

└ Include Child.jspf (modal)


이런구조로된 jsp 프로젝트에서 body안에 있는 모달에서


모달관련 함수가 절대 안먹는것이었다.

문제는

<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script> 이게 충돌이 먹어서였는데


어째서인지 body.jsp에서는 드롭다운도 잘되고 딴것도 다 잘되는데 modal 관련 함수만 전혀 안먹는거였다 (단순히 모달 fade in out은 잘됨)


딱 한순간 문제를 해결 할 수있엇는데, child.jspf에서 <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script> 해주면

모달관련 함수는 먹었지만 문제는 body와 nav에서 부트스트랩관련 함수가 전혀 안먹었다(drop dwon 등등)


특히 이런 모달 콜백 함수가 전혀 안먹는게 나를 미치게 만들었다..

$('#genieModal').on('show.bs.modal',function (e) {

});


콜백을 안쓰면 엄청난 노가다를 해주어야했기에, 모든 방법을 동원해서 찾았지만 결국 안되는 것이엇다.



solution: 그 찰나  jQuery.noConflict(); 라는 기적적인 마법의키워드를 검색으로 알게되었다.


child 관련 <script> 안에 저키워드를 한번 써주니까 모든 충돌이 해결되었다.




문자열 간의 최단거리 찾기
 

***Scenario:데이터 활용시 사람간의 매칭 기능을 만드려고 참고한 내용

(주관식 설문지를 작성할경우) 예를들어 혈액형을 입력하라고 하자.
A임, A형,  A형임,

이 3답변은 실질적으로 같은답변이지만 단순히 Like 를 사용해서 쿼리를 작성할경우 찾을 수 가 없다.

그렇다면 어떻게 하면 3개의 답변이 비슷하다고 가정 할 수있을까?? 원래는 DAO에서 모든 데이터를 불러온다음 자료구좋에 넣어 파싱을 해서 검색을 하려고했다.

그러나 오버헤드가 너무 클 것같았다. 고민하던중 다음과 같은 포스팅을 찾을 수있엇다


두 개의 문자열 사이에 유사도가 가까울수록 같은 계열의 값으로 판단할 수 있을것이다.

이러한 기능을 수행하려면 모든 데이터 값들간의 조인이 일어나야하는데 사용자 정의 함수를 사용하면

최적화 되지 않는 경우가 많기 때문에 프로젝트에서 결과값을 얻기 쉽지가 않다.

Oracle 11g에서의 new feature가 있는데 아주 유용한 기능으로 소개하기로 한다.

DROP TABLE match_tab;

CREATE TABLE match_tab (
  id   NUMBER,
  col1 VARCHAR2(50),
  col2 VARCHAR2(50),
  CONSTRAINT match_tab_pk PRIMARY  KEY (id)
);

INSERT INTO match_tab VALUES (1, 'Peter Parker', 'Pete Parker');
INSERT INTO match_tab VALUES (2, 'Peter Parker', 'peter parker');
INSERT INTO match_tab VALUES (3, 'Clark Kent', 'Claire Kent');
INSERT INTO match_tab VALUES (4, 'Wonder Woman', 'Ponder Woman');
INSERT INTO match_tab VALUES (5, 'Superman', 'Superman');
INSERT INTO match_tab VALUES (6, 'The Hulk', 'Iron Man');

INSERT INTO match_tab VALUES (11, '환자입원일시', '환자입원일');
INSERT INTO match_tab VALUES (12, '슈퍼맨', '슈퍼 맨');
INSERT INTO match_tab VALUES (13, '슈퍼맨', '슈퍼맨');
INSERT INTO match_tab VALUES (14, '슈퍼맨', '아이언맨');
INSERT INTO match_tab VALUES (15, '동창생', '도차생');
INSERT INTO match_tab VALUES (16, '일반 환자 격리', '일반환자격리');
INSERT INTO match_tab VALUES (17, '트러블 메 이 커', '트메이크');

COMMIT;

SELECT col1,
       col2,
       UTL_MATCH.edit_distance(col1, col2) AS ed,
       UTL_MATCH.edit_distance_similarity(col1, col2) AS eds,
       UTL_MATCH.jaro_winkler(col1, col2) AS jw,
       UTL_MATCH.jaro_winkler_similarity(col1, col2) AS jws
FROM   COMP_TABLE
ORDER BY id;

우리가 눈여겨 볼만한것은 유사도입니다. EDS, JWS

영문과 한글일때의 유사도의 차이는 조금 다르지만 문자열에 대한 유사도를 찾을수 있는

좋은 기능입니다.

잘만 응용하면 좋은 TIP이 될수 있을것입니다.


출처:http://www.dator.co.kr/newyemac/894089


Scenario: 이번 프로젝트를 할때 설문조사를 실행하여 사람과 사람간의 유사한답변을 찾은사람끼리 매칭시켜주는 기능을 만들고자 했었다.


Solutions: 맨처음에는 주관식을 하여 단어간의 유사성을 찾아 매칭시켜줄려고 했지만, 객관식으로 하는것이 더 깔끔 할 것같아서 바꿈


1.테이블 구조(간단함)

SQL 0.19 KB
  1. CREATE TABLE MBER_TQ
  2. (  
  3.     TQ_IDX         NUMBER  PRIMARY KEY,
  4.     MBER_EMAIL      varchar2(50) NULL,
  5.     TQ_QUESTION     NUMBER NULL,
  6.     TQ_ANSWER       NUMBER NULL,
  7.   DEL_FLAG varchar2(5) DEFAULT 'N'
  8. );


2.설문조사를 시작하자마자 수행되는 쿼리

SQL 0.63 KB
  1. --같은사용자가 재 설문조사를할경우 Init해주는 쿼리(시작하기전에 한번 실행)
  2. UPDATE MBER_TQ
  3. SET DEL_FLAG = 'Y'
  4. WHERE MBER_EMAIL = '1@gmail.com';
  5.  
  6.  
  7. --답변을 선택할때마다 동적으로 실행되는 인서트쿼리
  8. INSERT INTO MBER_TQ VALUES(SEQ_MBER_TQ_IDX.NEXTVAL ,'97@gmail.com' ,1,2,'N');
  9. INSERT INTO MBER_TQ VALUES(SEQ_MBER_TQ_IDX.NEXTVAL ,'98@gmail.com' ,1,1,'N');
  10. INSERT INTO MBER_TQ VALUES(SEQ_MBER_TQ_IDX.NEXTVAL ,'99@gmail.com' ,1,3,'N');
  11. INSERT INTO MBER_TQ VALUES(SEQ_MBER_TQ_IDX.NEXTVAL ,'100@gmail.com' ,1,4,'N');
  12. INSERT INTO MBER_TQ VALUES(SEQ_MBER_TQ_IDX.NEXTVAL ,'101@gmail.com' ,1,2,'N');



3.핵심쿼리(내가 선택한 답변을 db에서 다른사람이 선택한 답변과 비교하여 상위 4명을 잘라서 보여줌)

SQL 0.77 KB
  1. SELECT MBER_NAME, MBER_IMG, MBER_INFO_IDX, MBER_SKILL, MBER_INTRODUCE, MI.MBER_EMAIL, SCORE
  2. FROM(SELECT MBER_EMAIL, SCORE
  3.      FROM  
  4.       (SELECT A.MBER_EMAIL ,SUM(B.SCORE) AS SCORE
  5.        FROM MBER_TQ A JOIN
  6.         (SELECT  MBER_EMAIL, TQ_QUESTION, TQ_ANSWER, 1 SCORE
  7.          FROM MBER_TQ
  8.          WHERE MBER_EMAIL='a@GMAIL.COM'
  9.          AND DEL_FLAG != 'Y') B
  10.        ON A.TQ_QUESTION = B.TQ_QUESTION
  11.        AND A.TQ_ANSWER = B.TQ_ANSWER
  12.        AND A.MBER_EMAIL != 'a@GMAIL.COM'
  13.        AND DEL_FLAG != 'Y'
  14.        AND SCORE IS NOT NULL
  15.        GROUP BY A.MBER_EMAIL
  16.        ORDER BY SUM(B.SCORE) DESC)
  17.        WHERE ROWNUM <= 4) GENIE, MBER_INFO MI ,MBER
  18. WHERE GENIE.MBER_EMAIL = MI.MBER_EMAIL
  19. AND MBER.MBER_EMAIL = MI.MBER_EMAIL
  20. ORDER BY GENIE.SCORE DESC;


+ Recent posts