programing

정렬된 결과 집합의 위치를 기준으로 mysql 테이블에서 레코드에 대한 단일 행 번호 가져오기

mailnote 2023. 7. 15. 10:27
반응형

정렬된 결과 집합의 위치를 기준으로 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

반응형