정렬된 결과 집합의 위치를 기준으로 mysql 테이블에서 레코드에 대한 단일 행 번호 가져오기
id와 counter라는 두 개의 필드가 있는 테이블이 있습니다.카운터 필드별로 모든 레코드를 정렬한 다음 ID로 레코드 하나를 선택하여 전체 테이블에서 카운터 옆에 위치한 위치를 확인합니다.예:
| 이드 | 계산대 |
|---|---|
| 1 | 1 |
| 2 | 5 |
| 3 | 6 |
| 4 | 0 |
| 5 | 4 |
카운터별 ASC 순서는 다음과 같습니다.4, 1, 5, 2, 3.
그리고 id=2에 대한 위치를 얻고 싶다고 하자, 결과 집합에서 앞에 있으므로 제가 찾고 있는 값은 4입니다.
ROW_NUMBER 접근 방식을 사용하는 몇 가지 솔루션을 찾았지만 모두 전체 결과로 작동하는 것 같습니다.특정 행에 대한 이 하나의 특정 값을 ID로 원합니다.
카운터가 변경될 때 테이블을 업데이트하여 카운터 필드 옆의 테이블에 순위를 저장하는 더 간단한 솔루션을 사용하려고 했습니다.
UPDATE mytable
SET counter_rank = ( SELECT COUNT(*)
FROM mytable
WHERE counter >= ( SELECT counter
FROM mytable
WHERE id = ?
GROUP BY counter)
)
WHERE id = ?
이는 좋은 해결책이지만 다른 카운터가 변경되면 모든 행에 대한 순위를 계산해야 하기 때문에 작동하지 않습니다. 이는 제 경우에 좋은 생각이 아닙니다.따라서 행 번호 접근 방식을 사용한 동적 솔루션을 살펴봐야 합니다.
카운터별 그룹화도 고려해야 합니다. 여러 행이 동일한 카운터 값을 가짐으로써 순위에서 위치를 공유할 수 있습니다.둘 이상의 행이 동일한 번호/위치를 반환할 수 있습니다.
순위가 있는 행이 여러 개인 경우에는 검색한 대로 하위 쿼리에서 ROW_NUMBER를 사용합니다.그런 다음 해당 하위 쿼리에서 원하는 행을 선택합니다.그러나 행이 하나만 있는 경우에는 이전 행을 카운트하는 조인을 통해 가장 쉽게 수행할 수 있습니다.
select mytable.id, mytable.counter, count(t2.id) counter_rank
from mytable
left join mytable t2 on t2.counter < mytable.counter
where mytable.id=2
(0 기반 카운터가 아닌 1 기반 카운터를 원할 경우 1 추가)
SELECT id, counter,
ROW_NUMBER() OVER (ORDER BY counter) position
FROM mytable
/* ORDER BY {needed expression} */
;
특정 행의 경우:
WITH cte AS (
SELECT id, counter,
ROW_NUMBER() OVER (ORDER BY counter) position
FROM mytable
)
SELECT * FROM cte WHERE id = {needed value}
;
쿼리는 다음과 같은 경우 결정론적이지 않습니다.counter고유하지 않습니다. 이 경우 정렬 식을 확장해야 합니다.예를 들어, tillORDER BY couner, id.
또한 버전이 창 기능을 전송한 경우 다음과 같은 쿼리를 사용할 수 있습니다.
SELECT FIND_IN_SET('2', GROUP_CONCAT(id ORDER BY counter)) AS position
FROM pos
ORDER BY counter;
견본의
MariaDB [test]> select * from pos;
+----+---------+
| id | counter |
+----+---------+
| 1 | 1 |
| 2 | 5 |
| 3 | 6 |
| 4 | 0 |
| 5 | 4 |
+----+---------+
5 rows in set (0.000 sec)
MariaDB [test]> SELECT FIND_IN_SET('2', GROUP_CONCAT(id ORDER BY counter)) AS position
-> FROM pos
-> ORDER BY counter;
+----------+
| position |
+----------+
| 4 |
+----------+
1 row in set (0.000 sec)
MariaDB [test]>
언급URL : https://stackoverflow.com/questions/70671814/get-single-row-number-for-record-from-mysql-table-by-its-position-in-sorted-resu
'programing' 카테고리의 다른 글
| $in을 사용한 대소문자 구분 안 함 검색 (0) | 2023.07.15 |
|---|---|
| "LINQ 표현식 노드 유형 'Invoke'는 LINQ to Entities에서 지원되지 않습니다." - 스텀핑! (0) | 2023.07.15 |
| 실제 애플리케이션 측면에서 C, C# 및 C++의 차이점은 무엇입니까? (0) | 2023.07.15 |
| Ref 개체가 정의되지 않은 TypeScriptReact일 수 있습니다. (0) | 2023.07.15 |
| inteliJ 스프링 부트 그래들 플러그인 3.0.0에서 일치하는 변형을 찾을 수 없습니다. (0) | 2023.07.15 |