programing

뷰 제한으로 정렬한 다음 다른 열로 정렬

randomtip 2022. 10. 12. 21:23
반응형

뷰 제한으로 정렬한 다음 다른 열로 정렬

뷰별로 정렬하고 4로 제한하는 쿼리가 데이터베이스에서 *를 데이터베이스에서 선택합니다.

SELECT * FROM articles WHERE visible = 1 ORDER BY views LIMIT 4;

그러나 같은 쿼리에서 updated_at 열별로 정렬된 다른 모든 행을 찾습니다.

이런 시도도 해봤지만 잘 되지 않는다.

(SELECT * FROM articles ORDER BY views DESC LIMIT 4)
UNION
(SELECT * FROM articles ORDER BY updated_at DESC);

제안서는 홈페이지에서 가장 인기 있는 기사 4개를 "고정"하여 시간별로 주문하는 것입니다.

행을 반복하지 않고 동일한 쿼리에서 여러 방법으로 주문하는 방법이 있습니까?

이거 어떻게 해?

현재 당신의 생각으로, 우리는 두 개의 서브쿼리를 결합할 수 있습니다.첫 번째 서브쿼리는 이미 질문에 포함시킨 내용이며 자주 보는 4개의 문서를 찾습니다.두 번째 서브쿼리는 다른 모든 것을 찾습니다.여기서의 요령은 각 서브쿼리에 계산필드를 포함시키는 것입니다.이 필드를 사용하여 상위 4개의 레코드를 추적할 수 있습니다.그런 다음 먼저 이 계산 필드를 기준으로 정렬하고, 그 다음에 다음 순서로 정렬합니다.updated_at들판.

(
    SELECT a.*, 1 AS label
    FROM articles a
    WHERE visible = 1
    ORDER BY views DESC
    LIMIT 4
)
UNION ALL
(
    SELECT a.*, 2
    FROM articles a
    WHERE visible = 1
    ORDER BY views DESC
    LIMIT 1000000 OFFSET 4    -- the limit 1000000 is arbitrary; just use a number
)                              -- larger than the expected size of your table
ORDER BY
    label, views, updated_at

MySQL 문서:

...UNION의 기본 동작은 중복된 행이 결과에서 삭제되는 것입니다.

그리고.

... SELECT에 RIMIT 없이 ORDER BY가 표시되면 효과가 없기 때문에 ORDER BY는 최적화되어 있습니다. ...

그래서 여기서 비결은limit두 번째 쿼리에서 다음을 수행합니다(제한을 선택하는 것은 사용자에게 달려 있습니다.

(SELECT * FROM articles WHERE visible = 1 ORDER BY views DESC LIMIT 4)
UNION
(SELECT * FROM articles WHERE visible = 1 ORDER BY updated_at DESC LIMIT 100);

쿼리는 MySQL 5.6 및 5.7에서 테스트되었습니다.

콤마를 사용하여 여러 개를 구분할 수 있습니다.ORDER명령어를 지정합니다.MySQL은 왼쪽에서 오른쪽으로 오더합니다.

SELECT * FROM articles WHERE visible = 1 ORDER BY views, updated_at DESC LIMIT 4;

언급URL : https://stackoverflow.com/questions/46893737/order-by-views-limiting-then-order-by-another-column

반응형