그룹 별 MySQL 주문


243

여기에 비슷한 질문이 많이 있지만 질문에 적절하게 대답한다고 생각하지 않습니다.

나는 현재 가장 인기있는 질문 에서 계속하고 괜찮다면 예제를 사용합니다.

이 인스턴스의 작업은 데이터베이스의 각 작성자에 대한 최신 게시물을 얻는 것입니다.

예제 쿼리는 항상 최신 게시물이 반환되는 것은 아니므로 사용할 수없는 결과를 생성합니다.

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

현재 허용되는 답변은

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

불행히도이 대답은 명백하고 단순하지 않으며 많은 경우 원래 쿼리보다 덜 안정적인 결과를 생성합니다.

최선의 해결책은 양식의 하위 쿼리를 사용하는 것입니다

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

내 질문은 간단한 것입니다 : 하위 쿼리에 의지하지 않고 그룹화하기 전에 행을 주문해야합니까?

편집 :이 질문은 다른 질문에서 계속되었으며 내 상황의 세부 사항이 약간 다릅니다. 특정 게시물의 고유 식별자 인 wp_posts.id도 있다고 가정 할 수 있습니다.


2
주어진 답변에 대한 의견에서 언급했듯이 동일한 타임 스탬프가있는 게시물이있을 수 있습니다. 그렇다면 데이터와 예상 결과가 포함 된 예를 제시하십시오. 그리고 왜이 결과를 기대하는지 설명하십시오. post_authorpost_date고유 행을 얻을하는 것만으로는 충분하지, 그래서 당 고유 한 행을 얻기 위해 더이 있어야한다post_author
선생님 Rufo

@SirRufo 당신 말이 맞아요, 난 당신을 위해 편집에 추가했습니다.
Rob Forrest

There are plenty of similar questions to be found on here but I don't think that any answer the question adequately.그게 바운티입니다.
궤도에서 가벼움 레이스

@LightnessRacesinOrbit, 현재 질문에 이미 제 생각에 잘못된 대답이 있다면 어떻게 하시겠습니까?
Rob Forrest

1
하위 쿼리를 사용하여 응답을 수락 한 이유가 궁금합니다. 질문에 명확하게 물을 때 ... ""어쨌든 하위 쿼리를 사용하지 않고 그룹화하기 전에 행을 주문해야합니까? "???
TV-C-15

답변:


373

ORDER BY하위 쿼리에서 in을 사용하는 것이이 문제에 대한 최상의 솔루션은 아닙니다.

max(post_date)작성자가 얻을 수있는 가장 좋은 해결책 은 하위 쿼리를 사용하여 최대 날짜를 반환 한 다음 최대 날짜와 최대 날짜 모두에 테이블에 조인하는 것 post_author입니다.

해결책은 다음과 같아야합니다.

SELECT p1.* 
FROM wp_posts p1
INNER JOIN
(
    SELECT max(post_date) MaxPostDate, post_author
    FROM wp_posts
    WHERE post_status='publish'
       AND post_type='post'
    GROUP BY post_author
) p2
  ON p1.post_author = p2.post_author
  AND p1.post_date = p2.MaxPostDate
WHERE p1.post_status='publish'
  AND p1.post_type='post'
order by p1.post_date desc

다음 샘플 데이터가있는 경우 :

CREATE TABLE wp_posts
    (`id` int, `title` varchar(6), `post_date` datetime, `post_author` varchar(3))
;

INSERT INTO wp_posts
    (`id`, `title`, `post_date`, `post_author`)
VALUES
    (1, 'Title1', '2013-01-01 00:00:00', 'Jim'),
    (2, 'Title2', '2013-02-01 00:00:00', 'Jim')
;

하위 쿼리는 최대 날짜와 작성자를 반환합니다.

MaxPostDate | Author
2/1/2013    | Jim

그런 다음 테이블에 다시 결합하기 때문에 두 값 모두 해당 게시물의 전체 세부 정보를 반환합니다.

Demo with SQL Fiddle을 참조하십시오 .

하위 쿼리를 사용 하여이 데이터를 정확하게 반환하는 것에 대한 의견을 확장합니다.

MySQL은 목록에 GROUP BY포함 시키는 모든 열로 강제하지 않습니다 SELECT. 결과적으로 GROUP BY하나의 열만 총 10 개의 열을 반환 하면 해당 열에 속하는 다른 열 값 post_author이 반환된다는 보장이 없습니다 . 열이 GROUP BYMySQL에 없으면 어떤 값을 반환할지 선택합니다.

집계 함수와 함께 하위 쿼리를 사용하면 매번 올바른 작성자 및 게시물이 반환됩니다.

참고로 MySQL에서는 ORDER BY하위 쿼리에서 in 을 사용할 수 GROUP BY있으며 SELECT목록의 모든 열에 적용 할 수 는 없지만 SQL Server를 포함한 다른 데이터베이스에서는이 동작이 허용되지 않습니다.


4
나는 당신이 한 일을 보았지만 가장 최근 게시물의 전체 행이 아니라 가장 최근 게시물이 작성된 날짜를 반환합니다.
Rob Forrest

1
@RobForrest는 조인이하는 일입니다. 하위 쿼리에서 작성자에 의해 가장 최근의 게시 날짜를 반환 한 다음 wp_posts두 열 모두 에 다시 연결하여 전체 행을 가져옵니다.
Taryn

7
@RobForrest 하나의 열만 적용 할 때 GROUP BY다른 열의 값이 일관되게 정확하다는 보장은 없습니다. 불행히도 MySQL은 이러한 유형의 SELECT / GROUPing이 다른 제품에서는 발생하지 않도록합니다. 둘째, ORDER BYMySQL에서 허용되는 동안 하위 쿼리에서 in 을 사용하는 구문은 SQL Server를 포함한 다른 데이터베이스 제품에서는 허용되지 않습니다. 실행될 때마다 올바른 결과를 반환하는 솔루션을 사용해야합니다.
Taryn

2
스케일링을 위해서는 화합물 INDEX(post_author, post_date)이 중요합니다.
Rick James

1
@ jtcotton63 사실이지만 post_id내부 쿼리를 입력하면 기술적으로 그룹화해야하므로 결과가 왜곡 될 수 있습니다.
Taryn

20

솔루션은 일부 필드 (이 경우에는 ) 별로 그룹화 할 수있는 GROUP BY 절의 확장을 사용합니다 post_author.

GROUP BY wp_posts.post_author

집계되지 않은 열을 선택하십시오.

SELECT wp_posts.*

group by 절에 나열되지 않거나 집계 함수 (MIN, MAX, COUNT 등)에 사용되지 않는

GROUP BY 절에 대한 확장의 올바른 사용법

이는 집계되지 않은 열의 모든 값이 모든 행에 대해 동일한 경우에 유용합니다.

예를 들어, 테이블이 있다고 가정 GardensFlowers( name정원의 flower정원에서 성장) :

INSERT INTO GardensFlowers VALUES
('Central Park',       'Magnolia'),
('Hyde Park',          'Tulip'),
('Gardens By The Bay', 'Peony'),
('Gardens By The Bay', 'Cherry Blossom');

여러 꽃이 자라는 정원에서 자라는 모든 꽃을 추출하려고합니다. 그런 다음 하위 쿼리를 사용해야합니다. 예를 들어 다음을 사용할 수 있습니다.

SELECT GardensFlowers.*
FROM   GardensFlowers
WHERE  name IN (SELECT   name
                FROM     GardensFlowers
                GROUP BY name
                HAVING   COUNT(DISTINCT flower)>1);

가드에서 유일한 꽃인 모든 꽃을 추출해야하는 경우 HAVING 조건을로 변경하면 HAVING COUNT(DISTINCT flower)=1되지만 MySql에서는 다음을 사용할 수도 있습니다.

SELECT   GardensFlowers.*
FROM     GardensFlowers
GROUP BY name
HAVING   COUNT(DISTINCT flower)=1;

하위 쿼리는없고 표준 SQL은 아니지만 더 단순합니다.

GROUP BY 절의 확장을 잘못 사용함

그러나 모든 행에 대해 동일하지 않은 집계되지 않은 열을 선택하면 어떻게됩니까? MySql이 해당 열에 대해 선택하는 값은 무엇입니까?

MySql은 항상 FIRST 값을 선택하는 것처럼 보입니다 .

첫 번째 값이 원하는 값인지 정확히 확인하려면 GROUP BY정렬 된 쿼리에 a 를 적용 해야하므로 하위 쿼리를 사용해야합니다. 그렇지 않으면 할 수 없습니다.

MySql이 항상 첫 번째 행을 선택한다고 가정하면 GROUP BY 전에 행을 올바르게 정렬합니다. 그러나 불행히도 설명서를주의 깊게 읽으면이 가정이 사실이 아님을 알 수 있습니다.

항상 같지 않은 집계되지 않은 열을 선택할 때 MySql은 값을 자유롭게 선택할 수 있으므로 실제로 표시되는 결과 값은 미정 입니다.

집계되지 않은 열의 첫 번째 값을 얻는이 트릭은 많이 사용되며 일반적으로 / 거의 항상 작동하므로 때로는 내 자신의 위험으로 사용합니다. 그러나 문서화되어 있지 않으므로이 동작에 의존 할 수 없습니다.

이 링크 (ypercube 덕분에!) GROUP BY 트릭이 최적화되었습니다 . 동일한 쿼리가 MySql과 MariaDB간에 다른 최적화 엔진으로 인해 다른 결과를 반환하는 상황을 보여줍니다.

따라서이 방법이 효과가 있으면 운이 좋을뿐입니다.

다른 문제에 허용 대답은 나에게 잘못 같습니다 :

HAVING wp_posts.post_date = MAX(wp_posts.post_date)

wp_posts.post_date은 집계되지 않은 열이며 그 값은 공식적으로 결정되지 않지만 처음 post_date발견 될 수 있습니다 . 그러나 GROUP BY 트릭이 정렬되지 않은 테이블에 적용되기 때문에 어느 것이 첫 번째인지 확실하지 않습니다 post_date.

아마도 단일 저자의 유일한 게시물 인 게시물을 반환 할 것이지만 항상 확실하지는 않습니다.

가능한 해결책

이것이 가능한 해결책이라고 생각합니다.

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

내부 쿼리에서 모든 저자의 최대 게시 날짜를 반환합니다. 그런 다음 동일한 저자가 이론적으로 동시에 두 개의 게시물을 가질 수 있다는 사실을 고려하고 있으므로 최대 ID 만 얻습니다. 그런 다음 최대 ID를 가진 모든 행을 반환합니다. IN 절 대신 조인을 사용하여 더 빠르게 만들 수 있습니다.

(확실히 ID증가하고 있다고 확신 하면 ID1 > ID2을 의미하는 경우 post_date1 > post_date2쿼리를 훨씬 간단하게 만들 수 있지만 이것이 사실인지 확실하지 않습니다).


그 점을 extension to GROUP By읽어 주셔서 감사합니다.
Rob Forrest


: MySQL의 5.7에 기본적으로 더 이상 작품 BY GROUP과 선택 식에 집계되지 열 stackoverflow.com/questions/34115174/... . 어떤 IMHO가 훨씬 안전하고 일부 사람들이 더 효율적인 쿼리를 작성하도록 강요합니다.
rink.attendant.6

이 답변은 하위 쿼리를 사용하지 않습니까? 원본 포스터가 하위 쿼리를 사용하지 않는 솔루션을 요구하지 않습니까?
TV-C-15

1
@ TV-C-15 문제는 하위 쿼리를 사용하는 데 문제가 있으며 하위 쿼리를 사용하지 않는 이유를 설명하고 있습니다. 심지어 허용 대답은 하위 쿼리를 사용하지만 (의지가 나쁜 생각하는 이유를 설명 시작 하위 쿼리가이 문제에 대한 최선의 해결책은 아니다에 의해 주문을 사용 )
fthiella

9

당신이 읽을 내용은 다소 해킹이므로 집에서 시도하지 마십시오!

SQL에서 일반적으로 귀하의 질문에 대한 답변은 NO 이지만 GROUP BY( @bluefeet에 의해 언급 된 ) 완화 모드로 인해 MySQL 의 대답은 입니다.

(post_status, post_type, post_author, post_date)에 BTREE 인덱스가 있다고 가정하십시오. 후드 아래의 인덱스는 어떻게 보입니까?

(post_status = 'publish', post_type = 'post', post_author = 'user A', post_date = '2012-12-01') (post_status = 'publish', post_type = 'post', post_author = 'user A', post_date = '2012-12-31') (post_status = 'publish', post_type = 'post', post_author = 'user B', post_date = '2012-10-01') (post_status = 'publish', post_type = ' post ', post_author ='사용자 B ', post_date ='2012-12-01 ')

즉, 데이터는 모든 필드를 기준으로 오름차순으로 정렬됩니다.

GROUP BY기본적으로 작업을 수행 하면 그룹화 필드 ( post_author, 우리의 경우 post_status, post_type이 WHERE절에 필요함)별로 데이터를 정렬하고 일치하는 인덱스가 있으면 첫 번째 레코드마다 오름차순으로 데이터를 가져옵니다. 즉, 쿼리는 다음을 가져옵니다 (각 사용자의 첫 번째 게시물).

(post_status = 'publish', post_type = 'post', post_author = 'user A', post_date = '2012-12-01') (post_status = 'publish', post_type = 'post', post_author = 'user B', post_date = '2012-10-01')

그러나 GROUP BYMySQL에서는 순서를 명시 적으로 지정할 수 있습니다. 그리고 post_user내림차순으로 요청하면 색인이 반대 순서로 진행되어 실제로 마지막 인 각 그룹의 첫 번째 레코드를 계속 사용합니다.

그건

...
WHERE wp_posts.post_status='publish' AND wp_posts.post_type='post'
GROUP BY wp_posts.post_author DESC

우리에게 줄 것이다

(post_status = 'publish', post_type = 'post', post_author = 'user B', post_date = '2012-12-01') (post_status = 'publish', post_type = 'post', post_author = 'user A', post_date = '2012-12-31')

이제 post_date로 그룹화 결과를 주문하면 원하는 데이터를 얻을 수 있습니다.

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

NB :

이것은이 특정 쿼리에 권장하지 않습니다. 이 경우 @bluefeet가 제안한 약간 수정 된 버전을 사용 합니다. 그러나이 기술은 매우 유용 할 수 있습니다. 내 대답을 여기에서보십시오 : 각 그룹의 마지막 레코드 검색

함정 : 접근 방식의 단점은

  • 쿼리 결과는 SQL의 정신에 위배되는 인덱스에 따라 다릅니다 (인덱스는 쿼리 속도를 높여야합니다).
  • 인덱스는 쿼리에 미치는 영향에 대해 아무것도 알지 못합니다 (나중에 누군가 다른 사람이 인덱스를 너무 많이 소비하고 인덱스를 변경하여 성능뿐만 아니라 쿼리 결과를 깨뜨릴 수 있음)
  • 쿼리의 작동 방식을 이해하지 못하는 경우 한 달 안에 설명을 잊어 버릴 수 있으며 쿼리가 사용자와 동료를 혼란스럽게 할 것입니다.

장점은 어려운 경우의 성능입니다. 이 경우 정렬과 관련된 데이터 양 때문에 모든 쿼리가 @bluefeet의 쿼리와 동일해야합니다 (모든 데이터는 임시 테이블에로드 된 후 정렬됩니다. btw, 쿼리에는 (post_status, post_type, post_author, post_date)인덱스도 필요함 ). .

내가 제안하는 것 :

내가 말했듯이, 이러한 쿼리는 MySQL 낭비 시간을 잠재적으로 대량의 데이터를 임시 테이블에서 정렬하게합니다. 페이징이 필요한 경우 (즉, LIMIT 관련) 대부분의 데이터가 폐기됩니다. 내가 할 일은 정렬 된 데이터의 양을 최소화하는 것입니다. 즉, 하위 쿼리에서 최소 데이터를 정렬하고 제한 한 다음 전체 테이블로 다시 조인합니다.

SELECT * 
FROM wp_posts
INNER JOIN
(
  SELECT max(post_date) post_date, post_author
  FROM wp_posts
  WHERE post_status='publish' AND post_type='post'
  GROUP BY post_author
  ORDER BY post_date DESC
  -- LIMIT GOES HERE
) p2 USING (post_author, post_date)
WHERE post_status='publish' AND post_type='post';

위에서 설명한 접근 방식을 사용하는 동일한 쿼리 :

SELECT *
FROM (
  SELECT post_id
  FROM wp_posts
  WHERE post_status='publish' AND post_type='post'
  GROUP BY post_author DESC
  ORDER BY post_date DESC
  -- LIMIT GOES HERE
) as ids
JOIN wp_posts USING (post_id);

에 자신의 실행 계획과 그 모든 쿼리 SQLFiddle .


그것은 당신이가는 흥미로운 기술입니다. 두 가지 : 집에서 이것을 시도하지 말고 잠재적 인 함정은 무엇입니까? 두 번째로, 약간 수정 된 bluefeet의 답변을 언급했습니다.
Rob Forrest

누군가가 문제를 다른 방식으로 공격하는 것을 보는 것은 흥미 롭습니다. 내 데이터 세트가 18M + 행 근처에 없기 때문에 성능이 유지 관리 성만큼 중요하다고 생각하지 않으므로 나중에 옵션이 더 적합하다고 생각합니다. 하위 쿼리 내부의 한계에 대한 아이디어가 마음에 듭니다.
롭 포레스트

8

이거 한번 해봐. 각 작성자로부터 최신 게시물 날짜 목록을 얻으십시오 . 그게 다야

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

@Rob Forrest에서 솔루션을 확인하십시오. 희망적으로 질문을 해결합니다!
sanchitkhanna26

1
미안하지만 그게 효과가 없을 것 같아요. 예를 들어 저자 1과 저자 2가 모두 01/02/13에 무언가를 게시 한 다음 저자 2가 08/02/13에 새로운 것을 올리면 3 개의 게시물이 모두 반환됩니다. 예, 날짜 / 시간 필드에는 시간이 포함되어 있으므로 상황이 발생할 가능성은 적지 만 충분히 큰 데이터 세트에서 보장되는 것은 아닙니다.
Rob Forrest

를 사용하는 일 post_date IN (select max(...) ...). 이것은 선택 하위에 의해 그룹을하는 것보다 더 효율적 참조입니다 dev.mysql.com/doc/refman/5.6/en/subquery-optimization.html
Seaux

명확하게 말하면 post_author가 색인 된 경우에만 더 적합합니다.
Seaux

1
IN ( SELECT ... )동등한 JOIN보다 훨씬 덜 효율적입니다.
Rick James

3

아니요. 그룹화가 결과 세트를 변경하므로 그룹화하기 전에 레코드를 정렬하는 것은 의미가 없습니다. 하위 쿼리 방식이 선호되는 방식입니다. 이 작업이 너무 느리면 각 작성자의 마지막 게시물 ID를 별도의 테이블에 저장하거나 각 작성자에게 자신의 게시물 중 마지막 게시물을 나타내는 부울 열을 표시하여 테이블 디자인을 변경해야합니다. 하나.


Dennish,이 유형의 쿼리가 올바른 SQL 구문이 아니므로 데이터베이스 플랫폼에서 이식성이 없다는 Bluefeet의 의견에 어떻게 응답 하시겠습니까? 또한 이것이 항상 올바른 결과를 낳을 것이라는 보장이 없다는 우려도 있습니다.
Rob Forrest

2

최대 기능과 그룹 기능을 사용하십시오.

    select max(taskhistory.id) as id from taskhistory
            group by taskhistory.taskid
            order by taskhistory.datum desc

3
가장 높은 ID를 가진 사람이 가장 최근에 게시되지 않은 경우 어떻게됩니까? 예를 들어 저자가 게시물을 게시하기 전에 오랜 시간 동안 초안을 작성했을 수 있습니다.
롭 포레스트

0

요약하자면 표준 솔루션은 상관되지 않은 하위 쿼리를 사용하며 다음과 같습니다.

SELECT x.*
  FROM my_table x
  JOIN (SELECT grouping_criteria,MAX(ranking_criterion) max_n FROM my_table GROUP BY grouping_criteria) y
    ON y.grouping_criteria = x.grouping_criteria
   AND y.max_n = x.ranking_criterion;

고대 버전의 MySQL 또는 상당히 작은 데이터 세트를 사용하는 경우 다음 방법을 사용할 수 있습니다.

SELECT x.*
  FROM my_table x
  LEFT
  JOIN my_table y
    ON y.joining_criteria = x.joining_criteria
   AND y.ranking_criteria < x.ranking_criteria
 WHERE y.some_non_null_column IS NULL;  

고대 버전을 말할 때 어떤 버전의 MySQL이 실행됩니까? 그리고 죄송합니다.이 예제에서는 데이터 세트가 상당히 큽니다.
Rob Forrest

모든 버전에서 (느리게) 작동합니다. 이전 버전은 하위 쿼리를 사용할 수 없습니다.
Strawberry

그러나 방법 # 2 (내가 시도한 버전은 여기 에서 온 것임)는 큰 데이터 세트 (수백만 행)에서 작동하지 않으며 연결 끊김 오류가 발생합니다. 방법 # 1은 쿼리를 실행하는 데 ~ 15 초가 걸립니다. 처음에는 중첩 쿼리를 사용하지 않으려 고했지만 다시 생각하게되었습니다. 감사합니다!
aexl

@TheSexiestManinJamaica 예. 3.5 년 동안 많은 변화가 없었습니다. 쿼리 자체가 효율적이라고 가정하면 쿼리를 실행하는 데 걸리는 시간은 데이터 집합의 크기, 인덱스 배열 및 사용 가능한 하드웨어에 크게 좌우됩니다.
Strawberry

-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
ORDER  BY wp_posts.post_date DESC; 

수정 된 쿼리

SELECT p.post_status,
       p.post_type,
       Max(p.post_date),
       p.post_author
FROM   wp_posts P
WHERE  p.post_status = "publish"
       AND p.post_type = "post"
GROUP  BY p.post_author
ORDER  BY p.post_date; 

==> max에서 사용 하기 때문에 하위 선택 쿼리를 피하고 그룹 옆의 최대 열을 기준으로 순서를 피할 수 있습니다.select clausemax(p.post_date)


1
이것은 실제로 저자 당 가장 최근의 post_date를 반환하지만 반환되는 나머지 데이터가 가장 최근 post_date를 가진 게시물과 관련이 있다는 보장은 없습니다.
Rob Forrest

@RobForrest-> 왜 그런지 모르겠습니까? 답을 정교하게하고 클레임을 포기하는 것이 좋습니다. 내가 이해하는 한 관련 데이터를 필터링하기 위해 where 절을 사용하면 데이터가 관련이 보장됩니다.
guykaplan

1
어느 정도까지는, 당신이 선택하는 4 개의 필드 각각은 그 최대 post_date와 관련이 있지만, 이것은 질문에 대한 답이 아닙니다. 예를 들어, post_id 또는 게시물의 내용을 추가 한 경우 해당 열은 최대 날짜와 동일한 레코드에서 보장되지 않습니다. 위의 쿼리를 통해 게시물의 나머지 세부 정보를 반환하려면 두 번째 쿼리를 실행해야합니다. 질문이 가장 최근 게시물의 날짜를 찾는 것에 관한 것이라면 네, 괜찮습니다.
Rob Forrest

@guykaplan, 서브 쿼리는 느리지 않습니다. 데이터 세트의 크기는 중요하지 않습니다. 사용 방법에 따라 다릅니다. percona.com/blog/2010/03/18/when-the-subselect-runs-faster
Pacerier

@Pacerier :이 기사는 실제로 하위 쿼리에서 성능 이점을 얻을 수있는 방법을 보여 주지만 주어진 시나리오를 더 나은 성능으로 변환하는 것을보고 싶습니다. 데이터 크기가 중요합니다. 다시 게시 한 기사에서 작업 할 테이블이 하나만 있다고 가정합니다. 데이터 크기는 행 크기가 아니라 복잡성 크기입니다. 실제로 큰 테이블 (많은 테이블이 필요하지 않음)로 작업하는 경우 하위 쿼리가 훨씬 더 성능이 좋을 수 있습니다.
guykaplan 2016 년

-4

먼저, select에서 *를 사용하지 말고 성능에 영향을 미치며 그룹 사용 및 주문 기준 사용을 방해하십시오. 이 쿼리를 시도하십시오 :

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

ORDER BY에서 테이블을 지정하지 않고 별명 만 선택하면 결과가 정렬됩니다.


select *를 무시하십시오.이 예에서는 간결합니다. 당신의 대답은 내가 처음으로 보여준 예와 정확히 같습니다.
Rob Forrest

별명은 리턴되는 행이나 결과 정렬에 영향을주지 않습니다.
Rob Forrest
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.