반응형
MariaDB/MySQL RANK() 구현
저는 MS SQL Server에서 MariaDB 10.0으로의 이행 작업을 하고 있습니다.RANK() Partition BY를 사용하는 질문이 있습니다.이미 테이블에 RANK() 실장을 작성했는데 제대로 작동하지 않습니다.
최초 쿼리는 다음과 같습니다.
RANK() OVER (PARTITION BY visits.id_partner ORDER BY visits.updated_at DESC) AS rank
MariaDB/MySQL 구현:
SELECT
...,
(
CASE visits.id_partner
WHEN @currId THEN
@curRow := @curRow + 1
ELSE
@curRow := 1 AND @currId := visits.id_partner
END
) AS rank
FROM
records rec
JOIN visits ON visits.id = rec.id_visit,
(
SELECT
@curRank := 0,
@currId := NULL
) r
WHERE
...
ORDER BY visits.id_partner ASC, visits.updated_at DESC
id_partner order별로 updated_at 필드별로 순위가 매겨진 행을 선택하고 싶습니다.id_partner가 행과 동일한 경우 RANK가 1씩 증가해야 합니다.이전과 다를 경우 1로 리셋해야 합니다.
하지만 제 질문은 전혀 효과가 없습니다.나는 여전히 모든 줄에서 1위를 차지하고 있다.실수 찾는 것 좀 도와줄래?
도와주셔서 감사합니다!
MySQL/MariaDB에서 변수를 사용하는 것은 어렵습니다.변수는 하나의 문에서만 사용하고 할당해야 합니다(올바른 대로).하지만,AND
can short-circuit 변수 할당.
저는 이런 구조를 사용해서ROW_NUMBER()
.RANK()
사실 좀 괴로운...DENSE_RANK()
그리고.ROW_NUMBER()
더 심플합니다.단, 이것이 당신이 목표로 하는 코드인 것 같습니다.
SELECT ...,
(@rn := if(@currId = visits.id_partner, @rn + 1,
if(@currId := visits.id_partner, 1, 1)
)
) as rank
FROM records rec JOIN
visits
ON visits.id = rec.id_visit CROSS JOIN
(SELECT @rn := 0, @currId := NULL) params
WHERE
...
ORDER BY visits.id_partner ASC, visits.updated_at DESC;
편집:
MySQL(아마도 MariaDB)에서는 서브쿼리를 사용하지 않으면 변수가 제대로 작동하지 않을 수 있습니다.자, 이걸 써보세요.
SELECT . . .,
(@rn := if(@currId = visits.id_partner, @rn + 1,
if(@currId := visits.id_partner, 1, 1)
)
) as rank
FROM (SELECT ...
FROM records rec JOIN
visits
ON visits.id = rec.id_visit
WHERE
...
ORDER BY visits.id_partner ASC, visits.updated_at DESC
) t CROSS JOIN
(SELECT @rn := 0, @currId := NULL) params;
언급URL : https://stackoverflow.com/questions/33435162/mariadb-mysql-rank-implementation
반응형
'programing' 카테고리의 다른 글
MySQL에서 다음/이전 레코드를 가져오려면 어떻게 해야 합니까? (0) | 2022.09.08 |
---|---|
루트 비밀번호를 null로 설정하는 방법 (0) | 2022.09.08 |
페이지 맨 아래까지 자동으로 스크롤 (0) | 2022.09.08 |
MariaDB: ALTER TABLE 구문을 사용하여 외부 키를 추가하시겠습니까? (0) | 2022.09.08 |
i++는 스레드가 안전하지 않다고 들었는데, ++i 스레드는 안전한가요? (0) | 2022.09.02 |