programing

그룹화 전 MySQL 주문 기준

goodsources 2022. 11. 20. 12:22
반응형

그룹화 전 MySQL 주문 기준

각 저자의 최신 게시물을 찾아 결과를 그룹화하여 각 저자에 대해 하나의 최신 게시물만 작성하도록 해야 합니다.

SELECT wp_posts.* FROM wp_posts
        WHERE wp_posts.post_status='publish'
        AND wp_posts.post_type='post'
        GROUP BY wp_posts.post_author           
        ORDER BY wp_posts.post_date DESC

이렇게 하면 출력물이 올바르게 그룹화되므로 작성자당 게시물은 1개뿐이지만, 결과가 그룹화된 후에 순서가 지정되고 선택되기 전에는 순서가 지정되지 않습니다.

select wp_posts.* from wp_posts
where wp_posts.post_status='publish'and wp_posts.post_type='post'
group by wp_posts.post_author
having wp_posts.post_date = MAX(wp_posts.post_date) /* ONLY THE LAST POST FOR EACH AUTHOR */
order by wp_posts.post_date desc


편집:

몇 가지 코멘트 후에 나는 몇 가지 정보를 추가하기로 결정했다.

제가 일하는 회사에서도 Postgres를 사용하고 있으며 특히 SQL Server를 사용하고 있습니다.이 데이터베이스는 이러한 쿼리를 허용하지 않습니다.다른 방법이 있다는 것을 알고 있습니다(아래에 해결책을 씁니다).투영에서 처리된 모든 열을 기준으로 그룹화하지 않거나 집계 함수를 사용하지 않을 경우 수행할 작업도 알아야 합니다.그렇지 않으면 내버려둬!

구체적인 질문이기 때문에 위의 솔루션을 선택했습니다.톰은 워드프레스 사이트에서 각 저자의 최근 게시물을 받고 싶어 합니다.내 생각에 한 작가가 초당 두 개 이상의 투고를 하는 것은 분석에 있어서 무시해도 될 것 같다.워드프레스는 이중 포스트 탐지를 통해 이를 금지해야 합니다.MySQL을 사용하여 이러한 지저분한 그룹을 수행하는 것이 퍼포먼스에 큰 이점이 있다는 것을 개인적인 경험으로 알고 있습니다.하지만 네가 뭘 하는지 안다면, 넌 할 수 있어!나는 전문적으로 책임을 지는 앱에 매우 더러운 그룹이 있다.여기 mio 행이 있는 테이블이 있습니다.이 테이블은 100초 이상에서 15초가 필요합니다.

장점과 단점에 대해 도움이 될 수 있습니다.http://ftp.nchu.edu.tw/MySQL/tech-resources/articles/debunking-group-by-myths.html


SELECT
    wp_posts.*
FROM 
    wp_posts
    JOIN 
    (
        SELECT
            g.post_author
            MAX(g.post_date) AS post_date
        FROM wp_posts as g
        WHERE
            g.post_status='publish'
            AND g.post_type='post'
        GROUP BY g.post_author
    ) as t 
    ON wp_posts.post_author = t.post_author AND wp_posts.post_date = t.post_date

ORDER BY wp_posts.post_date

그러나 여기에 작성자의 투고가 1초에 1개 이상 있는 경우, 마지막 행이 아닌 여러 행이 표시됩니다.

한 번 를 돌려서 높은 에 있는 수 있습니다.Id여기서도 최소한 마지막은 확실치 않다.

당신의 요건이 맞는지 모르겠지만, 다음 내부 스테이트먼트는 각 작성자의 최신 post_date 목록을 가져와 wp_posts 테이블과 결합하여 완전한 레코드를 얻습니다.

SELECT  *
FROM    wp_posts wp
        INNER JOIN (
          SELECT  post_author
                  , MAX(post_date) AS post_date
          FROM    wp_posts
          WHERE   post_status = 'publish'
                  AND post_type = 'post'
          GROUP BY
                  post.author
        ) wpmax ON wpmax.post_author = wp.post_author
                   AND wpmax.post_date = wp.post_date
ORDER BY
        wp.post_date DESC

나는 그 @edze 응답이 잘못되었다고 생각한다.

MySQL 설명서에서 다음을 읽을 수 있습니다.

MySQL은 GROUP BY 절에서 이름이 지정되지 않은 집계되지 않은 열을 선택 목록에서 참조할 수 있도록 GROUP BY의 사용을 확장합니다.이 기능을 사용하면 불필요한 열 정렬 및 그룹화를 방지하여 성능을 향상시킬 수 있습니다.그러나 GROUP BY에서 이름이 지정되지 않은 각 비집약 열의 모든 값이 각 그룹에 대해 동일한 경우 주로 유용합니다.서버는 각 그룹에서 임의의 값을 자유롭게 선택할 수 있기 때문에 같은 값이 아닌 한 선택한 값은 불확정입니다.또한 ORDER BY 절을 추가하여 각 그룹의 값 선택에 영향을 줄 수 없습니다.결과 세트의 정렬은 값을 선택한 후에 이루어지며 ORDER BY는 서버가 선택하는 값에는 영향을 주지 않습니다.

두 가지 참고 자료:

죄송합니다, 평판상 @edze 응답에 코멘트를 할 수 없기 때문에, 새로운 답변을 작성했습니다.

GROUP BY는 주문 후 다음과 같이 GROUP BY로 쿼리를 정리하여 수행합니다.

SELECT t.* FROM (SELECT * FROM table ORDER BY time DESC) t GROUP BY t.author

group-statement 전후에 주문해도 상관없습니다.오더는 213만이 123 또는 321로 가고 그 이상은 되지 않기 때문입니다.group by는 최신 항목뿐만 아니라 열당 일부 항목만 받습니다.여기서 서브셀렉트로 작업하는 것 같은데

SELECT wp_posts.* FROM wp_posts
        WHERE wp_posts.post_status='publish'
        AND wp_posts.post_type='post'
        AND wp_posts.post_date = (Select max(post_date) from wp_posts where author = ... )

당신은 이것에 대해 어떻게 생각하세요?나에게 효과가 있는 것 같다.

SELECT wp_posts.post_author, MAX(wp_posts.post_date), wp_posts.status, wp_posts.post_type
FROM wp_posts
    WHERE wp_posts.post_status='publish'
    AND wp_posts.post_type='post'
    GROUP BY wp_posts.post_author

그러면 최신 post_date를 가진 모든 작성자가 나타납니다.거기서 문제가 발견되었습니까?없어

    SELECT wp_posts.*,max(wp_posts.post_date) FROM wp_posts
    WHERE wp_posts.post_status='publish'
    AND wp_posts.post_type='post'
    GROUP BY wp_posts.post_author 

테이블이 커지면 퍼포먼스도 체크해야 합니다.136K 메시지가 있는 PM 시스템과 83K 행이 있는 링크 테이블을 사용하여 질문의 모든 옵션을 확인했습니다.

숫자만 필요한 경우 또는 ID만 필요한 경우 - Alex의 솔루션이 가장 좋습니다.

SELECT wp_posts.post_author, MAX(wp_posts.post_date), wp_posts.status, wp_posts.post_type
FROM wp_posts
    WHERE wp_posts.post_status='publish'
    AND wp_posts.post_type='post'
    GROUP BY wp_posts.post_author

다른 필드가 필요한 경우 Husky110 솔루션을 수정해야 합니다(테이블 설계에 대해서는 다음 예만 있음 - 체크되지 않음) 서브쿼리 옵션보다 10배 빠릅니다.

SELECT wp_posts.* FROM wp_posts,
    (Select post_id as pid,  max(post_date) maxdate from wp_posts where author = ... group by author order by maxdate  desc limit 4) t
    WHERE wp_posts.post_status='publish'
    AND wp_posts.post_type='post'
    AND wp_posts.post_id = pid

이 변경으로 여러 개의 게시물(예: 사용자용 게시물)을 선택할 수 있으며 다른 솔루션으로 수정할 수 있습니다.

모쉐.

아래 코드 사용...

<?php
//get all users, iterate through users, query for one post for the user,
//if there is a post then display the post title, author, content info
$blogusers = get_users_of_blog();
if ($blogusers) {
  foreach ($blogusers as $bloguser) {
    $args = array(
    'author' => $bloguser->user_id,
      'showposts' => 1,
      'caller_get_posts' => 1
    );
    $my_query = new WP_Query($args);
    if( $my_query->have_posts() ) {
      // $user = get_userdata($bloguser->user_id);
      // echo 'This is one post for author with User ID: ' . $user->ID . ' ' . $user-    >user_firstname . ' ' . $user->user_lastname;
      while ($my_query->have_posts()) : $my_query->the_post(); ?>
        <a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?    php the_title_attribute(); ?>"><?php the_title(); ?></a>

        <small><?php the_time('F jS, Y') ?> by <?php the_author_posts_link() ?>     </small><?php
        the_content();
      endwhile;
    }
  }
}
?>

다음은 http://www.cafewebmaster.com/mysql-order-sort-group의 간단한 답변입니다.

SELECT * FROM 
(
select * from `my_table` order by timestamp desc
) as my_table_tmp

GROUP BY catid
ORDER BY nid desc

그것은 나에게 신기하게 작용했다.

언급URL : https://stackoverflow.com/questions/5140785/mysql-order-before-group-by

반응형