복붙노트

[SQL] PostgreSQL을 - GROUP BY 절

SQL

PostgreSQL을 - GROUP BY 절

나는 또한이 일치 주어진 태그 얼마나 많은 태그로 검색 한 다음 해당 태그가 사용 된 모든 기사를 나열하고 싶습니다. 그래서 예를 들어 내가있을 수 있습니다 :

 Page1 - 2 (has css and php tag)
 Page2 - 1 (has only css tag)

질문:

SELECT COUNT(t.tag)
FROM a_tags t
JOIN w_articles2tag a2t ON a2t.tag = t.id 
JOIN w_article a ON a.id = a2t.article 
WHERE t.tag = 'css' OR t.tag = 'php'
GROUP BY t.tag
LIMIT 9

난 단지 COUNT (t.tag) 쿼리 작품을 놓고, 나는 괜찮아 결과를 얻을 때. 그러나 만약 내가 APPEND 예를 들어, 내가 오류 다음 얻을 내 문서의 ID :

어떻게 이런 일이 쿼리에 말했다 열을 추가하려면?

해결법

  1. ==============================

    1.첫째, 포스트 그레스 9.1를 명확히 이상 (9.1의 릴리스 노트를 인용) ...

    첫째, 포스트 그레스 9.1를 명확히 이상 (9.1의 릴리스 노트를 인용) ...

    이 관련 답변 자세히보기 : 레일과 PostgreSQL을 사용하여 발생으로 그룹화 된 목록을 반환

    다음으로, 질문과 마이클의 대답은 논리 이전 버전을 가지고 @의 쿼리. 우리는 많은 기사가 특정 태그가 없습니다 어떻게 기사 당 일치 얼마나 많은 태그를 계산합니다. 우리는 GROUP BY 필요 그래서하지 a_tags.id에 의해, w_article.id.

    이 문제를 해결하려면 :

    SELECT COUNT(t.tag) AS ct, a.* -- any column from a allowed ...
    FROM   a_tags         t
    JOIN   w_articles2tag a2t ON a2t.tag = t.id 
    JOIN   w_article      a   ON a.id = a2t.article 
    WHERE  t.tag IN ('css', 'php')
    GROUP  BY a.id           -- ... since grouped by pk column of a
    LIMIT  9
    

    ID를 가정하면 w_article의 기본 키입니다. 같은 일을하는 동안 그러나,이 형태는 빨라집니다 :

    SELECT a.*, ct
    FROM  (
       SELECT a2t.article AS id, COUNT(*) AS ct
       FROM   a_tags         t
       JOIN   w_articles2tag a2t ON a2t.tag = t.id 
       GROUP  BY a.article 
       LIMIT  9      -- LIMIT early - cheaper
       ) sub
    JOIN   w_article a USING (id);  -- attached alias to article in the sub
    

    어제에서이 밀접하게 관련 답변 자세히보기 : 왜 다음은 크게 쿼리 시간을 증가에 가입합니까?

    제쳐두고 : 열 이름으로 일반, 비 기술적 인 ID를 사용하는 안티 패턴이다. 두 테이블에서 article_id를 등을 호출합니다. 쉽게 가입하고 당신은 쿼리의 별명 모든 시간을 사용할 필요가 없습니다.

  2. ==============================

    2.당신은 절 "에 의해 그룹의"를 사용하는 경우, 당신은 집계 함수로 분류되지 않은 모든 열을 묶어야합니다. "분 (a.title)은"대신 GROUP BY 목록에 제목을 추가하거나 선택하십시오.

    당신은 절 "에 의해 그룹의"를 사용하는 경우, 당신은 집계 함수로 분류되지 않은 모든 열을 묶어야합니다. "분 (a.title)은"대신 GROUP BY 목록에 제목을 추가하거나 선택하십시오.

    SELECT COUNT(t.tag), a.title FROM a_tags t
    JOIN w_articles2tag a2t ON a2t.tag = t.id 
    JOIN w_article a ON a.id = a2t.article 
    WHERE t.tag = 'css' OR t.tag = 'php' GROUP BY t.tag, a.title LIMIT 9
    
  3. from https://stackoverflow.com/questions/18991625/postgresql-group-by-clause by cc-by-sa and MIT license