같은 구조의 두 개의 테이블에서 특정 컬럼의 중복을 제외한 값을 출력시키고 싶습니다.

같은 구조의 두 개의 테이블에서 특정 컬럼의 중복을 제외한 값을 출력시키고 싶습니다.

QA

같은 구조의 두 개의 테이블에서 특정 컬럼의 중복을 제외한 값을 출력시키고 싶습니다.

본문

안녕하세요. 

table_A, table_B의 두 개의 테이블(구조및 컬럼명이 동일한 테이블)에서 특정 컬럼의 중복을 제외한 컬럼의 값을 출력시키고 싶은데 잘 안되서요. ㅠ

 

일단 출력 시키고자 하는 게 특정월에 중복을 제외한 'ID의 수'와 'ID' 값인데요.

 


$sql = "SELECT COUNT(mb_id) AS cnt FROM (
                SELECT mb_id FROM table_A WHERE datetime like '2024-01%'
                UNION
                SELECT mb_id FROM table_B WHERE datetime like '2024-01%'
                ) AS tscount ":
 
$monthly = sql_fetch($sql);

 

갯수는 위와 같이 UNION을 사용하여 중복제외 값을 얻었는데,

 

그누보드는 sql_query()에서 UNION을 지원하지 않아서 값을 따로 못뽑고 있습니다.ㅠㅠ

FULL JOIN을 사용하려 했는데 이건 또 저희 DB가 mysql을 사용하고 있어서 지원을 안하고...

 

그누보드 에서 막은 UNION관련 코드를 건드리고 싶지는 않구요.

mysql_query(), mysql_fetch_array() 이거로 UNION을 써봤는데 이거도 안먹히더라구요

 

머리가 안돌아가는 건지.. 서브쿼리등의 여러가지 방법을 생각해봐도 답이 잘 안나와서요.

 


$sql = " SELECT mb_id FROM table_A WHERE apply_datetime like '2024-01%'
          UNION
          SELECT mb_id FROM table_B WHERE apply_datetime like '2024-01%' ";
 
$monthly = sql_query($sql);

 

위의 쿼리랑 같은 결과가 나올 수 있게 UNION이나 FULL JOIN 없는 쿼리를 어떻게 만드는지

 

몇 시간 동안 헤매고 있는 이 초보에게 알려주시면 너무너무 감사하겠습니다. ㅠㅠ

이 질문에 댓글 쓰기 :

답변 2

보니까 주석처리에서 유니온 사용 허락을 안한다고 하네요

일단 유니온을 쓰려면 common.php 에서 1486번째줄에서 sql_query 함수가 있구요 거기 내부에 보면 아래 소스코드 주석처리 하면 될것 같아요

 


// union의 사용을 허락하지 않습니다.
//$sql = preg_replace("#^select.*from.*union.*#i", "select 1", $sql);
// $sql = preg_replace("#^select.*from.*[\s\(]+union[\s\)]+.*#i ", "select 1", $sql); << 이부분 주석처리 

유저가 사용하지는 않습니다.~ 관리자 몇 명만 보면 되는 거라서요. 따로 함수를 만드는 건 생각안해보긴 했는데 정 안되면 고민해볼 필요는 있을 거 같네요 ㅎㅎ

아니면 함수 내부에 플래그를 넣어서 뭐 sql_query("",false); 이렇게 파라미터로 줘요
if($flag) $sql = preg_replace("#^select.*from.*[\s\(]+union[\s\)]+.*#i ", "select 1", $sql);
이렇게 하면 사용하고 싶을때 이거 지정하면되구요

이거저거 제가 알고 있는 짧은지식 내에서는 방법이없어서 질답게시판에 다른 분께서 만들어 주셨던 유니온함수를 적용해서 사용했습니다.

시간내서 답변주셔서 너무 감사드립니다.~^^


$tblarr = ['table_A', 'table_B'];
$rows = [];
 
foreach ($tblarr as $tbl) {
    $sql = " SELECT DISTINCT mb_id FROM {$tbl} WHERE apply_datetime like '2024-01%' ";
    $monthly = sql_query($sql);
 
    while ($row = sql_fetch_array($monthly)) {
        $rows[] = $row['mb_id'];
    }
}
 
$rows = array_unique($rows);
print_r2($rows);

시간내주셔서 감사합니다~
만들어주신 소스를 적용해보니 해당 페이지 접근 시에 모레시계가 계속 돌아서 사용이 어려울 것 같습니다.ㅠ

인덱스를 해주면 될 거 같긴 한데 해당 DB를 다른 서비스에서도 사용하다 보니 다른 서비스에 영향이 갈 거 같긴해서요~(인덱스 해본적은 있는데 정확하게 어떤 로직인지 잘몰라서요^^;)

그래도 만들어주신 소스같은 방법도 있구나를 배웠습니다. 나중에 비슷한 상황에서 다시 활용해보겠습니다.

감사합니다!!

답변을 작성하시기 전에 로그인 해주세요.
전체 722
QA 내용 검색
filter #sql ×

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT