sql 이전행 wr_num 값을 구하고자 합니다.

sql 이전행 wr_num 값을 구하고자 합니다.

QA

sql 이전행 wr_num 값을 구하고자 합니다.

본문

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

현재 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

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 를 지원하고

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

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

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

 

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


...
print_r($row);
 
print_r(sql_error_info());

버전 의존성이 없는 구문의 경우
다음 코드가 도움이 될지 모르겠습니다.


$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);
}

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


      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 
        )

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'";

감사합니다.^^

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

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

 

다음처럼 해야할 것입니다

where wr_is_comment =0 and wr_id < $wr_id

 

 

 

답변을 작성하시기 전에 로그인 해주세요.
전체 124,901 | RSS
QA 내용 검색

회원로그인

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