[SQL] ORDER BY에서 행 위치를 얻을 MYSQL
SQLORDER 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.이 옵션을 사용합니다 :
이 옵션을 사용합니다 :
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.이것은 내가 생각할 수있는 유일한 방법입니다 :
이것은 내가 생각할 수있는 유일한 방법입니다 :
SELECT `id`, (SELECT COUNT(*) FROM `table` WHERE `name` <= 'Beta') AS `position`, `name` FROM `table` WHERE `name` = 'Beta'
-
==============================
3.쿼리가 간단하고 반환 된 결과 집합의 크기가 잠재적으로 큰 경우에, 당신은 두 개의 쿼리로 분할하려고 할 수 있습니다.
쿼리가 간단하고 반환 된 결과 집합의 크기가 잠재적으로 큰 경우에, 당신은 두 개의 쿼리로 분할하려고 할 수 있습니다.
좁은 다운 필터링 기준으로 첫 번째 질의는 해당 행의 데이터를 검색하고, 상기 제 질의 용도 절은 위치를 계산하여 WHERE COUNT.
귀하의 경우 예를 들어,
쿼리 1 :
테이블 SELECT * FROM WHERE 이름 = '베타'
질의 2 :
테이블에서 SELECT COUNT (1) 이름> = '베타'
우리는 2M 기록이있는 테이블에이 방법을 사용하고이 OMG 조랑말의 접근 방식보다 훨씬 더 확장 가능합니다.
-
==============================
4.테이블의 행의 위치는 목표 행보다 "더 나은"얼마나 많은 행을 나타냅니다.
테이블의 행의 위치는 목표 행보다 "더 나은"얼마나 많은 행을 나타냅니다.
그래서, 당신은 그 행을 계산해야합니다.
SELECT COUNT (*) + 1 테이블에서 WHERE 이름 < '베타'
동점의 경우, 가장 높은 위치는 복귀된다.
기존 "베타"행 후 "베타"의 이름이 같은 다른 행을 추가하는 경우가 분류에 같은 장소를 공유하는 것처럼, 다음 반환 된 위치는 여전히이 될 것입니다.
이것이 내가 질문 소유자가 이미 자신의 문제를 해결한다는 생각으로, 미래에 유사한 검색합니다 사람들에게 도움이되기를 바랍니다.
-
==============================
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.다른 답변도 나를 위해 복잡한 것 같다.
다른 답변도 나를 위해 복잡한 것 같다.
여기에 쉬운 예제 제공,하자 당신이 열이있는 테이블이 말 :
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.내가 허용 대답을 통해 가고 있었다 그리고 비트 그래서 여기에 복잡 그것의 단순화 된 버전입니다 보였다.
내가 허용 대답을 통해 가고 있었다 그리고 비트 그래서 여기에 복잡 그것의 단순화 된 버전입니다 보였다.
SELECT t,COUNT(*) AS position FROM t WHERE name <= 'search string' ORDER BY name
-
==============================
8.당신이 필요로 될 수있다 추가 구문입니다
당신이 필요로 될 수있다 추가 구문입니다
LIMIT
그래서 사용
SELECT * FROM tbl ORDER BY name ASC LIMIT 1
당신은 단지 하나 개의 행을 필요로하는 경우 ..
from https://stackoverflow.com/questions/3614666/mysql-get-row-position-in-order-by by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] PreparedStatement의에하여 setDate 사용 (0) | 2020.03.15 |
---|---|
[SQL] 어떻게 MySQL의에서 이름 문자열을 분할하는? (0) | 2020.03.15 |
[SQL] 나는 작은 따옴표와 주변 사용자 입력을 단일 따옴표를 이스케이프 SQL 주입에 대해 보호 할 수 있습니까? (0) | 2020.03.14 |
[SQL] 은 IN 값 목록 BY ORDER (0) | 2020.03.14 |
[SQL] 어떻게 INNER은 SQL Server에 가입하여 삭제하는 방법? (0) | 2020.03.14 |