programing

MySQL은 ORDER BY로 행 위치를 가져옵니다.

goodsources 2022. 11. 1. 00:03
반응형

MySQL은 ORDER BY로 행 위치를 가져옵니다.

다음 MySQL 테이블 사용:

+-----------------------------+
+ id INT UNSIGNED             +
+ name VARCHAR(100)           +
+-----------------------------+

테이블 의 다른 행에서 단일 행과 그 위치를 선택하려면 어떻게 해야 합니까?name ASC테이블 데이터가 다음과 같은 경우 이름별로 정렬하면 다음과 같습니다.

+-----------------------------+
+ id | name                   +
+-----------------------------+
+  5 | Alpha                  +
+  7 | Beta                   +
+  3 | Delta                  +
+ .....                       +
+  1 | Zed                    +
+-----------------------------+

how the the the the를 해야 하나요?Beta의의 현재 치치 치? ?? ?? ??원하는 결과 세트는 다음과 같습니다.

+-----------------------------+
+ id | position | name        +
+-----------------------------+
+  7 |        2 | Beta        +
+-----------------------------+

할 수 요.SELECT * FROM tbl ORDER BY name ASC그런 다음 PHP에 행을 열거하지만 하나의 행에만 큰 결과 세트를 로드하는 것은 낭비처럼 보입니다.

사용방법:

SELECT x.id, 
       x.position,
       x.name
  FROM (SELECT t.id,
               t.name,
               @rownum := @rownum + 1 AS position
          FROM TABLE t
          JOIN (SELECT @rownum := 0) r
      ORDER BY t.name) x
 WHERE x.name = 'Beta'

...고유한 포지션 값을 얻습니다.이것은, 다음과 같습니다.

SELECT t.id,
       (SELECT COUNT(*)
          FROM TABLE x
         WHERE x.name <= t.name) AS position,
       t.name    
  FROM TABLE t      
 WHERE t.name = 'Beta'

넥타이에도 같은 가치를 줄 거야IE: 두 번째에 두 개의 값이 있는 경우 첫 번째 쿼리가 둘 중 하나에 2의 위치를 부여하고 다른 쿼리에 3의 위치를 부여하면 둘 다 2의 위치를 갖게 됩니다.

이것이 내가 생각할 수 있는 유일한 방법이다.

SELECT `id`,
       (SELECT COUNT(*) FROM `table` WHERE `name` <= 'Beta') AS `position`,
       `name`
FROM `table`
WHERE `name` = 'Beta'

쿼리가 단순하고 반환된 결과 세트의 크기가 클 수 있는 경우 두 개의 쿼리로 분할할 수 있습니다.

행의 를 취득하기 두에서는 " " "가 사용됩니다.COUNTWHERE절을 사용하여 위치를 계산합니다.

예를 들면,

질문 1:

SELECT * FROM tbl WHERE name = 'Beta'

질문 2:

SELECT COUNT(1) FROM tbl WHERE name >= 'Beta'

이 접근방식은 2M 레코드 표에서 사용하고 있으며, OMG Pornes의 접근방식보다 훨씬 확장성이 뛰어납니다.

다른 답변들은 나에게 너무 복잡해 보인다.

다음은 간단한 입니다. 예를 들어 열이 있는 테이블이 있다고 가정해 보겠습니다.

userid | points

사용자 ID를 포인트별로 정렬하고 행 위치(사용자의 "순위")를 얻으려면 다음을 사용합니다.

SET @row_number = 0;

SELECT 
    (@row_number:=@row_number + 1) AS num, userid, points
FROM
    ourtable
ORDER BY points DESC

num에 행의 위치(순위)를 나타냅니다.

MySQL 8.0+를 사용하는 경우 ROW_NUMBER()를 사용할 수 있습니다.

표의 행 위치는 대상 행보다 "더 나은" 행 수를 나타냅니다.

따라서 이 행을 세어야 합니다.

COUNT FROM (*)+1 을 선택합니다.tableWHERE wherename'>

동점일 경우 가장 높은 위치가 반환됩니다.

기존 "Beta" 행 뒤에 "Beta"라는 동일한 이름의 행을 추가할 경우 반환되는 위치는 2가 됩니다. 이는 분류에서 동일한 위치를 공유하기 때문입니다.

질문자가 이미 문제를 해결했다고 생각하기 때문에 앞으로 비슷한 것을 찾는 사람들에게 도움이 되었으면 합니다.

매우 유사한 문제가 있기 때문에 같은 질문을 하지 않겠습니다만, 여기서 제가 무엇을 했는지 공유하겠습니다. 그룹별로, 그리고 AVG별로 주문해야 했습니다.서명이 있는 학생이 있어 순위를 매겨야 했습니다(즉, AVG를 계산하고, 다음으로 DESC에서 순서를 매겨야 합니다).그리고 나서 그 위치(순위)를 추가할 필요가 있었습니다.그래서 여기 있는 베스트답변과 매우 유사한 것을 실시했습니다.그 때문에, 제 문제에 대응한 약간의 변경을 가했습니다.

나는 마침내 그것을 넣었다.position외부 SELECT의 (랭크) 컬럼

SET @rank=0;
SELECT @rank := @rank + 1 AS ranking, t.avg, t.name
  FROM(SELECT avg(students_signatures.score) as avg, students.name as name
FROM alumnos_materia
JOIN (SELECT @rownum := 0) r
left JOIN students ON students.id=students_signatures.id_student
GROUP BY students.name order by avg DESC) t 

저는 인정된 답변을 검토 중이었고 조금 복잡해 보였기 때문에 여기 간략화된 버전이 있습니다.

SELECT t,COUNT(*) AS position FROM t      
 WHERE name <= 'search string' ORDER BY name

표의 순위(색인)가 필요한 유사한 유형의 문제가 있습니다.order by votes desc저는 아래와 같이 괜찮습니다.

Select *, ROW_NUMBER() OVER(ORDER BY votes DESC) as "rank"
From "category_model"
where ("model_type" = ? and "category_id" = ?)

필요한 것은 구문을 추가하는 것입니다.

LIMIT

그러니까 쓰세요

SELECT * FROM tbl ORDER BY name ASC LIMIT 1

한 줄만 필요하시면..

언급URL : https://stackoverflow.com/questions/3614666/mysql-get-row-position-in-order-by

반응형