쿼리에서 실제 행 번호를 얻을 수있는 방법이 있습니까?
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 서버는 지나치게 바쁘지 않으므로 중첩 된 하위 쿼리를 처리하는 것이 바람직했습니다.