테스트 사이트 - 개발 중인 베타 버전입니다

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

사팔삼이사구 1년 전 조회 4,489

안녕하세요. 

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

 

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

 

</strong></p>

<p>$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 ":</p>

<p> </p>

<p>$monthly = sql_fetch($sql);</p>

<p><strong>

 

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

 

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

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

 

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

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

 

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

 

</strong></p>

<p>$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%' ";</p>

<p> </p>

<p>$monthly = sql_query($sql);</p>

<p><strong>

 

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

 

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

댓글을 작성하려면 로그인이 필요합니다.

답변 2개

채택된 답변
+20 포인트

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

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

 

</p>

<p>// union의 사용을 허락하지 않습니다.</p>

<p>//$sql = preg_replace("#^select.*from.*union.*#i", "select 1", $sql);</p>

<p>// $sql = preg_replace("#^select.*from.*[\s\(]+union[\s\)]+.*#i ", "select 1", $sql); << 이부분 주석처리 </p>

<p>

로그인 후 평가할 수 있습니다

답변에 대한 댓글 5개

사팔삼이사구
1년 전
네 이건 알고 있는데 해킹때문에 권장하지 않는다고 해서 이 방법은 안쓰려고 합니다. ㅠ
리오닥터
1년 전
아니면 따로 함수를 만들어서 그건 어드민쪽에서 사용하는걸로 하면 되지 않을까요?
유저도 사용해야되나요?
사팔삼이사구
1년 전
유저가 사용하지는 않습니다.~ 관리자 몇 명만 보면 되는 거라서요. 따로 함수를 만드는 건 생각안해보긴 했는데 정 안되면 고민해볼 필요는 있을 거 같네요 ㅎㅎ
리오닥터
1년 전
아니면 함수 내부에 플래그를 넣어서 뭐 sql_query("",false); 이렇게 파라미터로 줘요
if($flag) $sql = preg_replace("#^select.*from.*[\s\(]+union[\s\)]+.*#i ", "select 1", $sql);
이렇게 하면 사용하고 싶을때 이거 지정하면되구요
사팔삼이사구
1년 전
이거저거 제가 알고 있는 짧은지식 내에서는 방법이없어서 질답게시판에 다른 분께서 만들어 주셨던 유니온함수를 적용해서 사용했습니다.

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

댓글을 작성하려면 로그인이 필요합니다.

1년 전

</p>

<p>$tblarr = ['table_A', 'table_B'];

$rows = [];</p>

<p> </p>

<p>foreach ($tblarr as $tbl) {

    $sql = " SELECT DISTINCT mb_id FROM {$tbl} WHERE apply_datetime like '2024-01%' ";

    $monthly = sql_query($sql);</p>

<p> </p>

<p>    while ($row = sql_fetch_array($monthly)) {

        $rows[] = $row['mb_id'];

    }

}</p>

<p> </p>

<p>$rows = array_unique($rows);

print_r2($rows);</p>

<p>

로그인 후 평가할 수 있습니다

답변에 대한 댓글 1개

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

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

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

감사합니다!!

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인