본문 바로가기
개발하는 '정'/PHP

PHP/MYSQL rownum으로 쿼리 출력한 순서대로 이전글 다음 글 구하기

by 주앤정_블로그 2022. 2. 22.

원하는 쿼리가 출력된 순서 그대로 이전,다음 번호를 구하는 소스

 

MYSQL에서 회원을 조회한다.

SELECT t.id, t.name
FROM table1 t 
WHERE t.name like '%test%' or t.name like '%홍길동%'
ORDER BY id DESC

일반 쿼리 조회 결과

기준이 id인 경우 번호를 구하기는 쉽지만

name처럼 중복값이 있거나 텍스트인 경우에는 순서를 매기기 어렵다.

 

이럴 때 @rownum:0 을 이용한다.

 

SELECT @rownum:=@rownum+1 row, t.id, t.name
FROM table1 t 
JOIN (select @rownum:=0) R
WHERE t.name like '%test%' or t.name like '%홍길동%'
ORDER BY id DESC

rownum으로 순번 매겨진 결과

rownum을 사용하면 출력된 행에 순번이 매겨진다.

 

//1. 출력된 행의 row 를 구한다.
$sql_page = "SELECT row FROM (
                SELECT @rownum:=@rownum+1 row, t.id, t.name
                FROM table1 t 
                JOIN (select @rownum:=0) R
                WHERE t.name like '%test%' or t.name like '%홍길동%'
                ORDER BY id DESC
			) a
            WHERE id = '6' "; //기준
$row_page = sql_fetch($sql_page);

//2. 이전 회원 번호
//1번의 row 보다 1이 작은 row의 값을 받아온다.
$sql_prev = "SELECT * FROM (
                SELECT @rownum:=@rownum+1 row, t.id, t.name
                FROM table1 t 
                JOIN (select @rownum:=0) R
                WHERE t.name like '%test%' or t.name like '%홍길동%'
                ORDER BY id DESC
			) a
            WHERE row = {$row_page['row']}-1 "; 
$row_prev = sql_fetch($sql_prev);

//다음 회원 번호
//1번의 row 보다 1이 큰 row의 값을 받아온다.
$sql_next = "SELECT * FROM (
                SELECT @rownum:=@rownum+1 row, t.id, t.name
                FROM table1 t 
                JOIN (select @rownum:=0) R
                WHERE t.name like '%test%' or t.name like '%홍길동%'
                ORDER BY id DESC
			) a
            WHERE row = {$row_page['row']}+1 ";
$row_next = sql_fetch($sql_next);

6번이 기준이라고 생각했을 때

$row_prev : Array( [row] => 5 [id] => 36413 [name] => test2 )

$row_next : Array( [row] => 7 [id] => 36465 [name] => 홍길동 )

로 저장되는 것이다.

 

 

이전글 : <a href="/member.php?id=<?php echo $row_prev['id'] ?>"><?php echo $row_prev['name'] ?></a>

다음글 : <a href="/member.php?id=<?php echo $row_next['id'] ?>"><?php echo $row_next['name'] ?></a>

 

 

+ 처음글과 마지막글

$sql_first ="SELECT t.id, t.name
            FROM table1 t 
            WHERE t.name like '%test%' or t.name like '%홍길동%'
            ORDER BY id DESC
            LIMIT 0,1";
$row_first = sql_fetch($sql_first);

//처음 : <a href="/member.php?id=<?php echo $row_first['id'] ?>"><?php echo $row_first['name'] ?></a>

$sql_page = "SELECT row FROM (
                SELECT @rownum:=@rownum+1 row, t.id, t.name
                FROM table1 t 
                JOIN (select @rownum:=0) R
                WHERE t.name like '%test%' or t.name like '%홍길동%'
                ORDER BY id DESC
			) a
            WHERE id = '{$id}' "; 
$row_page = sql_fetch($sql_page);

$sql_prev = "SELECT * FROM (
                SELECT @rownum:=@rownum+1 row, t.id, t.name
                FROM table1 t 
                JOIN (select @rownum:=0) R
                WHERE t.name like '%test%' or t.name like '%홍길동%'
                ORDER BY id DESC
			) a
            WHERE row = {$row_page['row']}-1 "; 
$row_prev = sql_fetch($sql_prev);

//이전글 : <a href="/member.php?id=<?php echo $row_prev['id'] ?>"><?php echo $row_prev['name'] ?></a>

$sql_next = "SELECT * FROM (
                SELECT @rownum:=@rownum+1 row, t.id, t.name
                FROM table1 t 
                JOIN (select @rownum:=0) R
                WHERE t.name like '%test%' or t.name like '%홍길동%'
                ORDER BY id DESC
			) a
            WHERE row = {$row_page['row']}+1 ";
$row_next = sql_fetch($sql_next);

//다음글 : <a href="/member.php?id=<?php echo $row_next['id'] ?>"><?php echo $row_next['name'] ?></a>

$sql_cnt ="SELECT count(*)-1 cnt
            FROM table1 t 
            WHERE t.name like '%test%' or t.name like '%홍길동%'";
$row_cnt = sql_fetch($sql_cnt);

$sql_last ="SELECT t.id, t.name
            FROM table1 t 
            JOIN (select @rownum:=0) R
            WHERE t.name like '%test%' or t.name like '%홍길동%'
            ORDER BY id DESC
            LIMIT {$row_cnt['cnt']},1";
$row_last = sql_fetch($sql_last);

//마지막 : <a href="/member.php?id=<?php echo $row_last['id'] ?>"><?php echo $row_last['name'] ?></a>

 

+ rownum으로 업데이트

rownum으로 업데이트

 

[mysql] 컬럼을 rownum 으로 update

MYSQL rownum을 추출해서 필드에 update하기 UPDATE table1 a, ( SELECT e.id, @rownum:=@rownum+1 as rowNum FROM table1 e, (SELECT @rownum := 0) rn ORDER BY e.id ) b SET a.id= b.rowNum WHERE a.id= b.id ;

zpxlcm.tistory.com

 

전임자가 id를 PK로 안 잡아놔서 이런 고생을 한다..

앞으로는 쓸 일이 없으면 좋겠다 제발

 

 

 

반응형

댓글