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

sql 이전행 wr_num 값을 구하고자 합니다. 채택완료

디블 1년 전 조회 1,053

게시물 순서를 바꾸는 연습을 하고있습니다.

현재 wr_id 를 이용해서 이전행의 wr_num값을 가져와서 서로 바꿔주면 될거 같은데...

잘 안되네요..

 

$sql="with ordered_example as (select wr_id, wr_num , lag(wr_num) over(order by wr_num) as prev_num from  g5_write_{$bo_table}) select wr_id, wr_num, prev_num from ordered_example where wr_id='$wr_id'"; $result=sql_query($sql); $row=sql_fetch_array($result); print_r($row);

 

gtp에 검색해서 구문을 짰는데... $row값이 Array ( ) 빈값으로 출력됩니다.

어떻게 이전행을 구할 수 있나요?

조언부탁드립니다.

 

gpt 예제입니다.---------------------  

WITH ordered_example AS (     SELECT          id,         num,         LAG(num) OVER (ORDER BY num) AS previous_num     FROM          example ) SELECT      id,     num,     previous_num FROM      ordered_example WHERE      id = 3;  

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

답변 3개

채택된 답변
+20 포인트
1년 전

WITH : https://dev.mysql.com/doc/refman/8.0/en/with.html

LAG : https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html

 

MySQL 의 버전이 8.0 이상인지 또는 MariaDB 에서 WITH, LAG 구문이 지원되는 버전인지

확인이 필요한 SQL 구문입니다.

 

구동중인 DBMS 가 WITH, LAG syntax 를 지원하고

쿼리에 작성된 필드와 테이블 이름이 올바르며

조건에 해당되는 데이터가 있다면

정상처리 되는 문제없는 쿼리와 소스이며

 

문제가 있는 경우 다음처럼 확인해 볼수 있습니다.

</p>

<p>...</p>

<p>print_r($row);</p>

<p> </p>

<p>print_r(sql_error_info());</p>

<p>

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

답변에 대한 댓글 3개

디블
1년 전
감사합니다.. 구문을 버전에 맞게 조정을 했습니다.^^
배르만
1년 전
버전 의존성이 없는 구문의 경우
다음 코드가 도움이 될지 모르겠습니다.
[code]
$sql = " select wr_id, wr_num from g5_write_{$bo_table} where wr_id <= {$wr_id} order by wr_num limit 2 ";
$result = sql_query($sql);
$result_num = sql_num_rows($result);

$row = sql_fetch_array($result);
if ($result_num == 2 && $row['wr_id'] == $wr_id) {
$a = [
'wr_id' => $row['wr_id'],
'wr_num' => $row['wr_num'],
];
$row = sql_fetch_array($result);
$b = [
'wr_id' => $row['wr_id'],
'wr_num' => $row['wr_num'],
];

$sql_switch = " update g5_write_{$bo_table} set wr_num = {$b['wr_num']} where wr_id = {$a['wr_id']} ";
sql_query($sql_switch);
$sql_switch = " update g5_write_{$bo_table} set wr_num = {$a['wr_num']} where wr_id = {$b['wr_id']} ";
sql_query($sql_switch);
}
[/code]
디블
1년 전
참고가 많이 되었습니다.
감사합니다.^^

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

1년 전

where wr_id < e1.wr_id <==이렇게 하면 안됩니다

wr_id 20(이동할 글) 바로 이전의 wr_id 19가 1번글의 댓글이 될 수도 있으니까요

 

다음처럼 해야할 것입니다

where wr_is_comment =0 and wr_id < $wr_id

 

 

 

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

답변에 대한 댓글 1개

디블
1년 전
아차...그렇군요.. 감사합니다.^^

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

한번 해봤는데 맞는지 모르겠네요...

</p>

<p>      WITH aaa AS (

         SELECT 

        LAG(wr_id) OVER (ORDER BY wr_id) AS previous_num

        , wr_id

    FROM 

        g10_write_notice

        )

        SELECT * FROM g10_write_notice WHERE wr_id = (       

            SELECT previous_num  FROM aaa    

              WHERE  wr_id = 4 

        )</p>

<p>

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

답변에 대한 댓글 1개

디블
1년 전
php가 7 이네요.
버전에 맞게 이렇게 했습니다.

$sql="select wr_id,wr_num,(select wr_num from g5_write_{$bo_table} where wr_id < e1.wr_id order by wr_id desc limit 1) as prev_num from g5_write_{$bo_table} e1 where e1.wr_id='$wr_id'";

감사합니다.^^

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

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

로그인