[mysql] MySQL을 사용하여 테이블에 레코드 인덱스를 포함하는 열을 어떻게 생성 할 수 있습니까?

쿼리에서 실제 행 번호를 얻을 수있는 방법이 있습니까?

score라는 필드로 league_girl이라는 테이블을 주문할 수 있기를 원합니다. 사용자 이름과 해당 사용자 이름의 실제 행 위치를 반환합니다.

특정 사용자가 어디에 있는지 알 수 있도록 사용자 순위를 지정하고 싶습니다. Joe는 200 점 중 100 위입니다.

User Score Row
Joe  100    1
Bob  50     2
Bill 10     3

여기에서 몇 가지 해결책을 보았지만 대부분을 시도했지만 실제로 행 번호를 반환하는 것은 없습니다.

나는 이것을 시도했다 :

SELECT position, username, score
FROM (SELECT @row := @row + 1 AS position, username, score 
       FROM league_girl GROUP BY username ORDER BY score DESC) 

파생 된대로

…하지만 행 위치를 반환하지 않는 것 같습니다.

어떤 아이디어?



답변

다음을 시도해 볼 수 있습니다.

SELECT  l.position, 
        l.username, 
        l.score,
        @curRow := @curRow + 1 AS row_number
FROM    league_girl l
JOIN    (SELECT @curRow := 0) r;

JOIN (SELECT @curRow := 0)부분은 별도의 SET명령 없이 변수 초기화를 허용합니다 .

테스트 케이스 :

CREATE TABLE league_girl (position int, username varchar(10), score int);
INSERT INTO league_girl VALUES (1, 'a', 10);
INSERT INTO league_girl VALUES (2, 'b', 25);
INSERT INTO league_girl VALUES (3, 'c', 75);
INSERT INTO league_girl VALUES (4, 'd', 25);
INSERT INTO league_girl VALUES (5, 'e', 55);
INSERT INTO league_girl VALUES (6, 'f', 80);
INSERT INTO league_girl VALUES (7, 'g', 15);

테스트 쿼리 :

SELECT  l.position, 
        l.username, 
        l.score,
        @curRow := @curRow + 1 AS row_number
FROM    league_girl l
JOIN    (SELECT @curRow := 0) r
WHERE   l.score > 50;

결과:

+----------+----------+-------+------------+
| position | username | score | row_number |
+----------+----------+-------+------------+
|        3 | c        |    75 |          1 |
|        5 | e        |    55 |          2 |
|        6 | f        |    80 |          3 |
+----------+----------+-------+------------+
3 rows in set (0.00 sec)


답변

SELECT @i:=@i+1 AS iterator, t.*
FROM tablename t,(SELECT @i:=0) foo


답변

내가 사용한 템플릿의 구조는 다음과 같습니다.

  select
          /*this is a row number counter*/
          ( select @rownum := @rownum + 1 from ( select @rownum := 0 ) d2 ) 
          as rownumber,
          d3.*
  from 
  ( select d1.* from table_name d1 ) d3

그리고 여기 내 작업 코드가 있습니다.

select     
           ( select @rownum := @rownum + 1 from ( select @rownum := 0 ) d2 ) 
           as rownumber,
           d3.*
from
(   select     year( d1.date ), month( d1.date ), count( d1.id )
    from       maindatabase d1
    where      ( ( d1.date >= '2013-01-01' ) and ( d1.date <= '2014-12-31' ) )
    group by   YEAR( d1.date ), MONTH( d1.date ) ) d3


답변

당신은 또한 사용할 수 있습니다

SELECT @curRow := ifnull(@curRow,0) + 1 Row, ...

카운터 변수를 초기화합니다.


답변

MySQL이이를 지원한다고 가정하면 표준 SQL 하위 쿼리를 사용하여 쉽게 수행 할 수 있습니다.

select 
    (count(*) from league_girl l1 where l2.score > l1.score and l1.id <> l2.id) as position,
    username,
    score
from league_girl l2
order by score;

많은 양의 결과가 표시되는 경우 약간 느리며 대신 자체 조인으로 전환하는 것이 좋습니다.


답변

필드 점수로 정렬 한 후 특정 사용자의 위치 만 알고 싶다면 테이블에서 필드 점수가 현재 사용자 점수보다 높은 모든 행을 선택하기 만하면됩니다. 그리고 반환 된 행 번호 + 1을 사용하여 현재 사용자의 위치를 ​​알 수 있습니다.

테이블이 league_girl이고 기본 필드가 이라고 가정하면 id다음을 사용할 수 있습니다.

SELECT count(id) + 1 as rank from league_girl where score > <your_user_score>


답변

원래 답변이 매우 도움이되었지만 삽입 한 행 번호를 기반으로 특정 행 집합을 가져오고 싶었습니다. 따라서 삽입 한 행 번호를 참조 할 수 있도록 전체 원래 답변을 하위 쿼리에 래핑했습니다.

SELECT * FROM
(
    SELECT *, @curRow := @curRow + 1 AS "row_number"
    FROM db.tableName, (SELECT @curRow := 0) r
) as temp
WHERE temp.row_number BETWEEN 1 and 10;

하위 쿼리에 하위 쿼리를 사용하는 것은 그다지 효율적이지 않으므로 SQL 서버가이 쿼리를 처리하도록하거나 전체 테이블을 가져 와서 응용 프로그램 / 웹 서버가 해당 행을 처리하도록하여 더 나은 결과를 얻을 수 있는지 테스트 해 볼 가치가 있습니다. .

개인적으로 내 SQL 서버는 지나치게 바쁘지 않으므로 중첩 된 하위 쿼리를 처리하는 것이 바람직했습니다.