it-source

자체 참조 테이블에서 주문 기준

criticalcode 2023. 2. 2. 21:09
반응형

자체 참조 테이블에서 주문 기준

(이런 기사에 대한) 코멘트 표가 있습니다.

---------------------------------------------------------------
id  |comment_id     |likes_count      |add_time
---------------------------------------------------------------
0      NULL            0                time0
1      NULL            2                time1
2      0               0                time2
3      0               0                time3
4      NULL            1                time4
5      1               0                time5

comment_id를 참조하고 있습니다.id같은 테이블에서요.언제comment_id는 NULL 입니다.이것은 이 코멘트가 부모(다른 코멘트에 대한 응답이 아니라 기사 자체에 대한 응답)을 의미합니다.다만, NULL이 아닌 경우는, 이 코멘트가 자녀(기사의 다른 코멘트에 대한 응답)임을 의미합니다.

사용 중인 쿼리는 각 자녀가 부모 아래에 표시되는 방식으로 결과를 정렬합니다.

SELECT *
FROM comments
ORDER BY
    COALESCE (comment_id, id) DESC, 
    (comment_id IS NULL) DESC, 
    likes_count DESC

하지만 어떻게 부모 코멘트를 해야 할지 모르겠다(자녀가 따라하는 경우)likes_count결과에서 가장 먼저 나타납니다.likes_count DESC결과는 항상 에 의해 지시되기 때문에 효과가 없는 것 같습니다.id.

쿼리에서 반환된 결과:

---------------------------------------------------------------
id  |comment_id     |likes_count      |add_time
---------------------------------------------------------------
0      NULL            0                time0
2      0               0                time2
3      0               0                time3
1      NULL            2                time1
5      1               0                time5
4      NULL            1                time4

예상 결과:

---------------------------------------------------------------
id  |comment_id     |likes_count      |add_time
---------------------------------------------------------------
1      NULL            2                time1
5      1               0                time5
4      NULL            1                time4
0      NULL            0                time0   
2      0               0                time2
3      0               0                time3

phpMyAdmin은 다음 정보를 표시합니다.

서버 유형:마리아DB

서버 버전: 10.1.40-MariaDB-cll-lve - MariaDB

서버 프로토콜 버전: 10

cpsrvd 11.78.0.34

데이터베이스 클라이언트버전: libmysql - 5.1.73

PHP 버전: 7.2.7

phpMyAdmin: 4.8.3

각 부모 자녀 그룹에 대해 최대 좋아요 수를 사용하여 정렬 수준을 추가할 수 있습니다.

SELECT *
FROM comments
ORDER BY
    MAX(likes_count) OVER (PARTITION BY COALESCE(comment_id, id)) DESC,
    COALESCE (comment_id, id) DESC, 
    comment_id IS NULL DESC;

데이터베이스(실제로 어떤 것이든)가 분석 기능을 지원하지 않는 경우 조인(join)을 사용하여 동일한 논리를 수행할 수 있습니다.

SELECT c1.*
FROM comments c1
INNER JOIN comments c2
    ON COALESCE(c1.comment_id, c1.id) = c2.id
ORDER BY
    c2.likes_count DESC,
    COALESCE (c1.comment_id, c1.id) DESC, 
    c1.comment_id IS NULL DESC;

언급URL : https://stackoverflow.com/questions/57131912/order-by-in-a-self-referencing-table

반응형