복붙노트

[SQL] ORDER BY에서 행 위치를 얻을 MYSQL

SQL

ORDER BY에서 행 위치를 얻을 MYSQL

다음 MySQL의 테이블 :

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

나는 하나의 행과 이름 ASC으로 정렬 된 테이블의 다른 행 사이의 위치를 ​​선택할 수있는 방법. 그래서 이름별로 정렬이 같은 테이블 데이터 외모 경우 :

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

어떻게 그 행의 현재 위치를 점점 베타 행을 선택할 수? 그 결과는 다음과 같이 될 것이다 위해 내가 찾고 있어요 설정 :

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

그때 PHP의 행을 열거 이름 ASC BY TBL 순서와 간단한 SELECT *를 할 수 있지만, 단지 하나의 행에 대해 잠재적으로 큰 결과 집합을로드 낭비 보인다.

해결법

  1. ==============================

    1.이 옵션을 사용합니다 :

    이 옵션을 사용합니다 :

    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 : 두 번째 장소에서 두 개의 값이있는 경우, 그들은 모두 첫 번째 쿼리가 다른 그들 중 하나, 3 2의 위치를 ​​줄 것이다 둘의 위치를해야합니다 ...

  2. ==============================

    2.이것은 내가 생각할 수있는 유일한 방법입니다 :

    이것은 내가 생각할 수있는 유일한 방법입니다 :

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

    3.쿼리가 간단하고 반환 된 결과 집합의 크기가 잠재적으로 큰 경우에, 당신은 두 개의 쿼리로 분할하려고 할 수 있습니다.

    쿼리가 간단하고 반환 된 결과 집합의 크기가 잠재적으로 큰 경우에, 당신은 두 개의 쿼리로 분할하려고 할 수 있습니다.

    좁은 다운 필터링 기준으로 첫 번째 질의는 해당 행의 데이터를 검색하고, 상기 제 질의 용도 절은 위치를 계산하여 WHERE COUNT.

    귀하의 경우 예를 들어,

    쿼리 1 :

    테이블 SELECT * FROM WHERE 이름 = '베타'

    질의 2 :

    테이블에서 SELECT COUNT (1) 이름> = '베타'

    우리는 2M 기록이있는 테이블에이 방법을 사용하고이 OMG 조랑말의 접근 방식보다 훨씬 더 확장 가능합니다.

  4. ==============================

    4.테이블의 행의 위치는 목표 행보다 "더 나은"얼마나 많은 행을 나타냅니다.

    테이블의 행의 위치는 목표 행보다 "더 나은"얼마나 많은 행을 나타냅니다.

    그래서, 당신은 그 행을 계산해야합니다.

    SELECT COUNT (*) + 1 테이블에서 WHERE 이름 < '베타'

    동점의 경우, 가장 높은 위치는 복귀된다.

    기존 "베타"행 후 "베타"의 이름이 같은 다른 행을 추가하는 경우가 분류에 같은 장소를 공유하는 것처럼, 다음 반환 된 위치는 여전히이 될 것입니다.

    이것이 내가 질문 소유자가 이미 자신의 문제를 해결한다는 생각으로, 미래에 유사한 검색합니다 사람들에게 도움이되기를 바랍니다.

  5. ==============================

    5.나는 같은 질문을하지 않습니다 그 이유는, 매우 매우 비슷한 문제를 가지고,하지만 난 내가 무슨 짓을했는지 여기에 공유합니다, 나는 AVG에 의해도에 의해 그룹 및 순서를 사용했다.  이 서명과 socore와 학생들이, 그리고 내가 그들을 평가했다 (즉, 내가 먼저 AVG를 CALC, 다음 DESC에서 그들을 주문하고 마지막으로 내가) 나를 위해 (순위 위치를 추가하는 데 필요한, 그래서 내가 그랬어 ) 내 문제에 적응 약간의 변화가 여기에 최고의 답변으로 매우 유사한 :

    나는 같은 질문을하지 않습니다 그 이유는, 매우 매우 비슷한 문제를 가지고,하지만 난 내가 무슨 짓을했는지 여기에 공유합니다, 나는 AVG에 의해도에 의해 그룹 및 순서를 사용했다.  이 서명과 socore와 학생들이, 그리고 내가 그들을 평가했다 (즉, 내가 먼저 AVG를 CALC, 다음 DESC에서 그들을 주문하고 마지막으로 내가) 나를 위해 (순위 위치를 추가하는 데 필요한, 그래서 내가 그랬어 ) 내 문제에 적응 약간의 변화가 여기에 최고의 답변으로 매우 유사한 :

    나는 마지막으로 외부 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 
    
  6. ==============================

    6.다른 답변도 나를 위해 복잡한 것 같다.

    다른 답변도 나를 위해 복잡한 것 같다.

    여기에 쉬운 예제 제공,하자 당신이 열이있는 테이블이 말 :

    userid | points
    

    당신은 행 위치를합니다 (사용자의 "순위"), 다음 사용 포인트로 사용자 ID를 정렬하고 싶어 :

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

    수녀는 당신에게 행 위치 (순위)를 제공합니다.

    당신은 MySQL의 경우 8.0 이상 당신은) (ROW_NUMBER을 사용할 수 있습니다

  7. ==============================

    7.내가 허용 대답을 통해 가고 있었다 그리고 비트 그래서 여기에 복잡 그것의 단순화 된 버전입니다 보였다.

    내가 허용 대답을 통해 가고 있었다 그리고 비트 그래서 여기에 복잡 그것의 단순화 된 버전입니다 보였다.

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

    8.당신이 필요로 될 수있다 추가 구문입니다

    당신이 필요로 될 수있다 추가 구문입니다

    LIMIT
    

    그래서 사용

    SELECT * FROM tbl ORDER BY name ASC LIMIT 1
    

    당신은 단지 하나 개의 행을 필요로하는 경우 ..

  9. from https://stackoverflow.com/questions/3614666/mysql-get-row-position-in-order-by by cc-by-sa and MIT license