원하는 쿼리가 출력된 순서 그대로 이전,다음 번호를 구하는 소스
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을 사용하면 출력된 행에 순번이 매겨진다.
//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으로 업데이트
[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로 안 잡아놔서 이런 고생을 한다..
앞으로는 쓸 일이 없으면 좋겠다 제발
반응형
'개발하는 '정' > PHP' 카테고리의 다른 글
ADOdb 테이블 생성, 변경, 삭제 + 데이터 조회, 처리 (0) | 2022.03.15 |
---|---|
PHP 그누보드5 관리자 메뉴 새창으로 열기 (0) | 2022.03.04 |
PHP 요일 구하기 (0) | 2022.02.17 |
[PHP] 엑셀 다운로드 시 숫자형을 문자형으로 출력하기 (0) | 2021.10.01 |
[PHP] HTML 태그 제거 함수 (Strip_tags) + strip_tags 안 먹힐 때 해결 (0) | 2021.05.07 |
댓글