반응형
MySQL: 다른 컬럼의 변경에 따라 컬럼에 순차적으로 지정
다음 열과 값을 가진 테이블이 있는 경우, 순서:parent_id
:
id parent_id line_no
-- --------- -------
1 2
2 2
3 2
4 3
5 4
6 4
그리고 나는 채우고 싶다.line_no
값이 나올 때마다 1로 다시 시작하는 일련 번호를 사용하여parent_id
변경:
id parent_id line_no
-- --------- -------
1 2 1
2 2 2
3 2 3
4 3 1
5 4 1
6 4 2
쿼리 또는 sproc는 어떻게 생겼습니까?
메모: 이 작업은 한 번만 수행하면 됩니다.내 PHP 코드에 새로운 함수가 있습니다. 이 함수는 자동적으로line_no
새로운 레코드가 추가될 때마다.이미 존재하는 기록만 업데이트하면 됩니다.
MySQL의 대부분의 버전은 지원하지 않습니다.row_number()
변수를 사용하여 이 작업을 수행할 수 있습니다.하지만 당신은 매우 조심해야 해요.MySQL은 변수 평가 순서를 보장하지 않습니다.select
변수에는 다른 식에서 참조되는 변수를 할당할 수 없습니다.
그래서:
select t.*,
(@rn := if(@p = parent_id, @rn + 1,
if(@p := parent_id, 1, 1)
)
) as line_no
from (select t.* from t order by id) t cross join
(select @p := 0, @rn := 0) params;
테이블을 정렬하기 위한 서브쿼리가 필요하지 않을 수 있습니다.버전 5.7 전후에서는 변수를 사용할 때 이것이 필요하게 되었습니다.
편집:
변수를 사용한 업데이트는 재미있습니다.이 경우 위의 서브쿼리를 사용합니다.
update t join
(select t.*,
(@rn := if(@p = parent_id, @rn + 1,
if(@p := parent_id, 1, 1)
)
) as new_line_no
from (select t.* from t order by id) t cross join
(select @p := 0, @rn := 0) params
) tt
on t.id = tt.id
set t.line_no = tt.new_line_no;
아니면 좀 더 오래된...
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table
(id SERIAL PRIMARY KEY
,parent_id INT NOT NULL
);
INSERT INTO my_table VALUES
(1, 2),
(2 , 2),
(3 , 2),
(4 , 3),
(5 , 4),
(6 , 4);
SELECT x.*
, CASE WHEN @prev = parent_id THEN @i := @i+1 ELSE @i := 1 END i
, @prev := parent_id prev
FROM my_table x
, (SELECT @prev:=null,@i:=0) vars
ORDER
BY parent_id,id;
+----+-----------+------+------+
| id | parent_id | i | prev |
+----+-----------+------+------+
| 1 | 2 | 1 | 2 |
| 2 | 2 | 2 | 2 |
| 3 | 2 | 3 | 2 |
| 4 | 3 | 1 | 3 |
| 5 | 4 | 1 | 4 |
| 6 | 4 | 2 | 4 |
+----+-----------+------+------+
서브쿼리는 다음과 같은 경우에 사용할 수 있습니다.row_number()
도움이 되지 않습니다.
select t.*,
(select count(*)
from table t1
where t1.parent_id = t.parent_id and t1.id <= t.id
) as line_no
from table t;
언급URL : https://stackoverflow.com/questions/52706441/mysql-sequentially-number-a-column-based-on-change-in-a-different-column
반응형
'programing' 카테고리의 다른 글
MariaDB UNIX_TIMESTamp()가 미래의 날짜를 사용할 때 NULL을 반환합니다. (0) | 2022.10.01 |
---|---|
PHP에서 foreach 루프를 사용하는 동안 배열의 마지막 요소 찾기 (1) | 2022.10.01 |
목록의 항목을 단일 문자열에 연결하려면 어떻게 해야 합니까? (0) | 2022.10.01 |
두 개 이상의 필드를 조합하여 검증하려면 어떻게 해야 합니까? (0) | 2022.10.01 |
v-select 옵션의 특성을 설정하는 방법 (0) | 2022.10.01 |