연우, 장을 열다.





파일이나 폴더에 우클릭해서 team 메뉴를 보면 SVN에 있는 파일과 송수신할 수 있다. 


commit : 내 로컬컴의 소스를 svn에 올린다.

update : svn의 파일을 내 로컬컴으로 소스를 받는다.

revert  : svn의 소스로 내 로컬컴의 소스를 교체한다.

synchronize with Repostitory : svn의 소스와 내 로컬컴의 소스를 비교한다.


이정도만 알아도 상사에게 욕 덜먹습니다.... ㅋㅋㅋㅋ


자바스크립트도로 쿠키를 제어할 수 있는줄 몰랐는데 찾아보니까 소스가 존재했습니다. 

하단에 나와있는  아이디 mainInfoLayer  이것이 팝업소스이고, 이것을 쿠키처리해 팝업을 작성했습니다. 


사용원하시는 분들 잘 활용하시길 바랍니다. :) 



<!-- 팝업 시작-->

<style>

map area:focus, map area:active {outline: none; border:0; }

</style>

<div style="position:absolute; margin:auto; width:512px; height:636px;; top:132px; left:215px; background:white;border:1px solid #000;display:none;" id="mainInfoLayer">

<div class="scroll_box_pure" style="overflow:hidden;">

<div class="popUpWrap" style="width:512px;height:100%; padding:0 !important;">

<!-- <img src="/resource/img/popup/seller_ingel_noti.jpg" /> -->

<img src="/resource/img/popup/seller_ginseng_noti.jpg" alt="2018년 설 기획 상품 셀러모집" usemap="#Map" hidefocus="true" />

<map name="Map" id="Map">

    <area alt="하루동안보지않기" title="하루동안보지않기" id="mapAr1" href="#" shape="poly" coords="1,615,140,616,141,633,3,634" />

    <area alt="팝업닫기" title="팝업닫기" id="mapAr2" href="#" shape="poly" coords="489,615,512,615,512,634,489,635" />

    <area alt="" id="mapAr3" title="" href="#" shape="poly" coords="49,447,151,447,163,459,164,465,163,472,159,477,153,482,150,485,49,485,44,482,40,476,37,470,36,462,40,454" />

</map>

<img src="/resource/img/popup/seller_ginseng_noti_close.jpg" alt="닫기버튼" id="ginseng_close" style="position:absolute;left:0px;bottom:0px;display:none;"/>

</div>

</div>

</div>

<script>

function setCookie(name, value, hours){

if(hours){

var date = new Date();

        date.setTime(date.getTime()+(hours*60*60*1000));

        var expires = "; expires="+date.toGMTString();

}

    document.cookie=name + "=" + escape(value) + "; path=/"+expires+";"

}

function openPop(){

     if(getCookie("mainpop")!="closepop"){

    $("#mainInfoLayer").show();

     }

}

function getCookie(name){

    var nameOfCookie = name + "=";24*60*60/24/12

    var x =0;

    while (x<=document.cookie.length){

        var y = (x+nameOfCookie.length);

        if(document.cookie.substring(x,y) == nameOfCookie){

            if((endOfCookie=document.cookie.indexOf(";",y))==-1)

                endOfCookie = document.cookie.length;

            return unescape(document.cookie.substring(y, endOfCookie));

            }

            x=document.cookie.indexOf(" ",x) +1;

            if(x==0)

            break;

            }

        return "";

}

openPop();

$(function(){

console.log();

$("#mapAr1").on("click", function(){

if(!$("#ginseng_close").hasClass("clicked")){

$("#ginseng_close").show();

$("#ginseng_close").addClass("clicked");

}else{

$("#ginseng_close").hide();

$("#ginseng_close").removeClass("clicked");

}

});

$("#ginseng_close").on("click", function(){

if(!$("#ginseng_close").hasClass("clicked")){

$("#ginseng_close").show();

$("#ginseng_close").addClass("clicked");

}else{

$("#ginseng_close").hide();

$("#ginseng_close").removeClass("clicked");

}

});

$("#mapAr2").on("click", function(){

$("#mainInfoLayer").hide("500");

if($("#ginseng_close").hasClass("clicked")){

//cookie start

setCookie("mainpop","closepop","24");

}

});

});

</script>

<!--팝업  끝  -->


만약 이미지 맵을 따서, 작업하다가 이미지 맵 라인을 지우고 싶다면 아래 글도 보고 오십시오! 진짜 유용할겁니다. ^^


쿼리문은 아래와 같다. 


select 

a. product_code as product_code, 

c.head_code as head_code,

(

select rt_flag from marketprd_return_list where product_code=a.product_code and a.org_marketprd_idx='test1234'

) as rt_flag,

a.as_info as asDetail,

a.rex_info as rtngExchDetail,

'02' as dlvClf,

c.weight as prdWght,

IF(c.head_code='02' && c.center_code='A','03','01')as orgnTypCd,

a.deli_cost as dlvCst1,

a.prd_noti_type as prd_noti_type

 from

 marketprd_header_list a, 

 marketprd_return_list b,

 product_list c 

 where 

a.org_marketprd_idx = b.org_marketprd_idx 

and a.product_code=c.product_code 

and a.org_marketprd_idx='test1234' 

and b.rt_flag in('0','')  group by a.product_code order by a.order_no; 


에러가 났던 지점은 위 굵은 글씨다. 


select rt_flag from marketprd_return_list where product_code=a.product_code and a.org_marketprd_idx='test1234'


테이블 marketprd_return_list 에서는 컬럼 product_code와 org_marketprd_idx가 존재한다. 하지만 .. 위 쿼리에서는 

에러 " SQL 오류 (1242): Subquery returns more than 1 row " 가 뜬다. 


에러 문구의 뜻은 서브 쿼리에 1개 로우 이상이 조회가 된다는 뜻이다. 


왜인지 고민하다가 찾은 답은 




서브쿼리인 select rt_flag from marketprd_return_list where product_code=a.product_code and a.org_marketprd_idx='test1234' 이곳에서는 a.org_marketprd_idx가 무엇인지 모른다.. 심지어 


A='' 라고 했을때 좌항에 있는 A 컬럼은 테이블 marketprd_return_list 여야 하는데 컬럼을 다른 테이블 a 에서 요청해서 에러가 떴던 부분이다. 


결론적으로는... 




select 

 a. product_code as product_code, 

 c.head_code as head_code,

(

 select rt_flag from marketprd_return_list where product_code=a.product_code and org_marketprd_idx=a.org_marketprd_idx 

) as rt_flag,

 a.as_info as asDetail,

 a.rex_info as rtngExchDetail,

 '02' as dlvClf,

 c.weight as prdWght,

 IF(c.head_code='02' && c.center_code='A','03','01')as orgnTypCd,

 a.deli_cost as dlvCst1,

 a.prd_noti_type as prd_noti_type

 from

 marketprd_header_list a, 

 marketprd_return_list b,

 product_list c 

 where 

 a.org_marketprd_idx = b.org_marketprd_idx 

 and a.product_code=c.product_code 

 and a.org_marketprd_idx='test1234' 

 and b.rt_flag in('0','')    group by a.product_code order by a.order_no; 


위 처럼 조회하니, 원하는 결과값이 도출됐다.




여기서 얻을 결론은 조인하여 서브쿼리를 조회해올때에는 A=B 라고 지칭하면, A에 해당하는 좌항은 서브 쿼리의 테이블이어야 한다는 점이다. 






이건 좀 어이없어서... ㅋㅋㅋ 메모합니다. 



말 그대로입니다. mysql 이 넘이, "나는 컬럼 fail_cnt를 못찾겠어 ㅠㅠ "

라고 하는겁니다. 


 select 

  count(CASE WHEN rt_flag=0 THEN 1 END) as fali_cnt ,

count(CASE WHEN rt_flag=1 THEN 1 END) as succ_cnt ,

count(CASE WHEN rt_flag IS NULL THEN 1 END) as null_cnt 

from tbl_trn_return_list where org_mkprd_idx='MKH20171208114012'


위처럼 조회를 했는데 


왜!! 자꾸 없다고 나오는지, 



실수는 여기부터였습니다. 



위처럼 쿼리를 짜놓고, 


 stmt = conn.prepareStatement(sql);

rs = stmt.executeQuery();

rs.next();

result = rs.getInt("succ_cnt")+"|"+rs.getInt("fial_cnt")+"|"+rs.getInt("null_cnt");


위 처럼.. 불러왔습니다. 



잘 보시면,  rs.getInt(""); 여기 안에 들어가는 컬럼명을 잘못 적은겁니다.


쉬운건데.. 당연히 나와야 하는건데... 안나오니까 참 ㅋㅋㅋㅋ 




여러분들도 혹시 저처럼 이런 에러를 만나면!  아 어디 분명오타가 있구나 생각해보십시오.. :) ㅋㅋㅋ 


-- 쿼리를 직접 사용
SELECT (LENGTH(v) - LENGTH(REPLACE(v, ';'''))) / LENGTH(';')
FROM (SELECT 'A;B;C;D;E;F;G' v) A;
 
 
-- 함수를 만들어 사용해도 편리함
CREATE FUNCTION COUNT_STR(X VARCHAR(255), DELIM VARCHAR(12))
   RETURNS INT
RETURN (LENGTH(X) - LENGTH(REPLACE(X, DELIM, ''))) / LENGTH(DELIM);
 
 
SELECT COUNT_STR(TEXT, ';') CNT
FROM (SELECT 'A;B;C;D;E;F;G' TEXT) A;

출처 : http://www.seobangnim.com/zbxe/DB/603393



위 커뮤니티에서 가져왔습니다. 


위처럼 쿼리 적용을 해보니, 찾는 문자열이 몇개가 해당 컬럼에 포함돼있는지 알수 있었습니다. 


제 케이스는 컬럼이 모두 "ㅁㅁㅁ|ㅍㅍㅍ|ㅇㅇㅇ" 이런 형식으로 데이타들이 들어가 있었어요. 전 '|' 이것이 몇개나 되는지 알고 싶었구요. 

그래서 아래와 같이 정보를 얻었습니다. 

 







이런 생각해본적 있으실겁니다.

특정 table A에다가 table B의 내용을 모두 집어 넣어버리고 싶은 적


테이블들의 관계에 따라서 특정 테이블 B의 내용을 temp 형식으로 모두 복사해 넣고싶은 상황일 수 있어요. 


내용을 조회해서 와서 바로 인썰트 하는 방법이 있습니다. 


table A

id    |    addr    |    gender

--------------------------------

no rows




table B 

id    |    name    |    addr    |    gender

------------------------------------------------

a        김길수        서울시        남

b        김민경        부천시        여

c        나소민        인천시        여


위처럼 테이블이 존재한다면, 


insert into table A select id, addr, gender from table B


라고 하면 됩니다. table A의 컬럼 순서와 동일하게 값을 불러와야만 적용이 됩니당


이 에러가 발생했던 건 


stmt = conn.prepareStatement(sql);

rs = stmt.executeQuery();


market_name =rs.getString(1);


위처럼 써서 에러가 떴다. 


잘 보시면 rs.next();가 없다. 


에러가 발생한 이유는 결국에  rs.next(); 가 없어서였다! 


따라서, 


if(rs.next()){   market_name =rs.getString(1);  } 


라던가 



while(rs.next()){

.

.

.

.

}


라던가 ! 작성하시고~ 쓰자



오늘 만났던 에러는 바로 

illegal operation on empty result set mysql


상황은 이러했다. 

포문을 돌면서, 조회했던 정보를 예쁘게 잘 INSERT 구문을 만들어서 


SQL문을 실행해주려고 했던 것이었음. 




sql = "select dispNo, dispNm, parentDispNo from tbl_mst_api_category_temp where market_code='1111' and dispNo ='"+forwardDispNo+"' "; //1건 조회stmt=conn.prepareStatement(sql);

rs1=stmt.executeQuery();


이렇게 결과값을 rs1에 담고, 


rs1.next();


를 위처럼 찍은 다음... 


sql = "insert tbl2 values (rs1.getString('aaa'),rs1.getString('bbb'),rs1.getInt('ccc'))";



위처럼.. sql문을 작성한 다음 실행 했더니 만났던 에러였다. 


illegal operation on empty result set mysql


요놈 참 깨름찍한 용어다. 


즉 mysql에서  빈결과( empty result set ) 를  돌려받는 것에 대한  불법적인 작용 정도로 인식하면 될것이다. .. . . .. 




empty result set 에 집중해서 생각해보니까, 

결국에, 조회했던 sql문인 

sql = "select dispNo, dispNm, parentDispNo from tbl_mst_api_category_temp where market_code='1111' and dispNo ='"+forwardDispNo+"' "; //1건 조회stmt

이것에서 조회되는 값이 없다는 의미였다 ㅠㅠ 

조회하는 값이 없어서 문제였던 것이 아니라, 

그 조회한 값이 마치 있다고 가정하고 내가 코딩을 했던 것이다. 


그래서 boolean값을 리턴하는 rs1.next로 실행하고자 하는 부분을 이프문으로 쌌더니, 자알 된다^^ 
if(rs1.next()){
  forwardDispNo =  rs1.getString("parentDispNo");
if(i==tempDepth -1){
  tempPrefix="";
}else{
  tempPrefix=" , ";
}
  tempStr += tempPrefix +" cate_code_" + i + "=" + rs1.getString("dispNo")   ;
  tempStr +=" , cate_name_" + i + "='" + rs1.getString("dispNm")+"'";
}




mysql 데이터 insert

web/mysql2017. 11. 19. 16:16

mysql data insert


데이터를 넣어줄때에는 


insert into testTbl (컬럼명a, 컬럼명b, 컬럼명c, 컬럼명d) values (컬럼의 값a, 컬럼의 값b, 컬럼의 값c, 컬럼의 값d ); 


위처럼 입력하면  됩니다


컬럼명은 생략이 가능합니다. 



insert into testTbl  values (컬럼의 값a, 컬럼의 값b, 컬럼의 값c, 컬럼의 값d ); 


위처럼 쓸 수 있다는 의미입니다. 한가지 주의하자면, 위처럼 생략해서 사용할 경우에는 값들의 순서 및 개수가 테이블에 정의된 열순서 및 개수와 동일해야 합니다.



따라서 어떤 값을 넣고 싶지 않다면 



insert into testTbl (컬럼명a, 컬럼명b,컬럼명d) values (컬럼의 값a, 컬럼의 값b, 컬럼의 값d ); 


위 처럼 넣어주시면 됩니다. 첫번째 쿼리에 있었던 컬럼명c가 사라진 상태입니다. 두둥


자동으로 증가하는 AUTO_INCREMENT는 어째야하지??

테이블의 속성에 AUTO_INCREMENTㅓ가 지정되어 있다면, insert에서는 해당 열이 없다고 생각하고 입력하면 됩니다. 


AUTO_INCREMENT는 자동으로 1부터 증가는 값을 입력해줍니다. AUTO_INCREMENT는 프라이머리키이거나 유니크로 지정해줘야하고, 데이터 형식은 꼭 숫자형식이어야 합니다. 


AUTO_INCREMENT로 지정된 열은 insert문에서 null값으로 지정하면 자동으로 값이 입력됩니다. 


CREAT TABLE testTbl2

( id int AUTO_INCREMENT PRIMARY KEY,

 userName char(3),

 age int );


insert into testTbl2 values (NULL, 'kay', '25');

insert into testTbl2 values (NULL, 'thia', '24');






group by

group by는 말그대로 그룹별로 묶어주는 역할을 합니다. 당신이 조회하는 테이블이 만약 고객 아이디가 있고, 고객이 주문해간 주문내역이라면, 


아이디로 그룹을 묶어서 얼마나 구매해 갔는지 궁금할 수 있습니다. 


그럴때에는 


select userId, SUM(amount) from buytbl group by useId order by userId; 


라고 검색하면 됩니다.


select userId, amount from buytbl order by userId;  


위 쿼리는 아이디별로 얼마나 구매했는지 알아볼 수 있는 것이 아니라

중복된 아이디가 있어도 전체의 데이타를 가져오는 결과입니다. 


구하고자 했던 것은 각 아이디별 총 구매량이었으니까 당연히 


select userId, SUM(amount) from buytbl group by useId order by userId;  


라고 쿼리 조회를 해야합니다. 


group by의 조건문을 쓸때에는 where이 아니라 having


만약 아이디별로 구매한 내역 중에서 5000이 넘는 amount를 구매한 사람이 알고 싶다면 우리는 이렇게 생각합니다. 


select userId, SUM(amount) from buytbl where sum(amount) > 5000 group by useId order by userId;  


하지만 이것의 조회는 오류가 발생합니다. 


"Error code : 11111. invalid use of group function"

 

자 위 오류를 시정하기 위해서는 


select userId, SUM(amount) from buytbl having sum(amount) > 5000 group by useId order by userId;  


위 처럼  where 대신 having을 작성해야 합니다. 



자, group by의 조건을 걸때에는 having을 작성해주셔야 합니다.




'web > mysql' 카테고리의 다른 글

insert table a select table b 대량 인썰트할때  (0) 2017.11.29
mysql 데이터 insert  (0) 2017.11.19
mysql 별칭 잘 쓰면 참 좋은 alias  (0) 2017.11.19
mysql 주석 -- /**/  (0) 2017.11.18
mysql 서브쿼리(sub query) -any all some  (0) 2017.11.17