복붙노트

[SQL] 한 카테고리 당 최신 2 개 아이템을 얻을하는 방법 (MySQL과) 선택

SQL

한 카테고리 당 최신 2 개 아이템을 얻을하는 방법 (MySQL과) 선택

다음과 같은 내 데이터 외모 :

id|category|insertdate|title....
--------------------------------
1|1|123|test 1
2|1|124|test 2
3|1|125|test 3
4|2|102|test 4
5|2|103|test 5
6|2|104|test 6

무엇을 달성하려고하는 결과가 있어야한다, 그래서 (insertdate DESC에 의해 순서대로) 카테고리 별 최신 두 항목을 얻을 수 있습니다 :

id|....
----
3|....
2|....
6|....
5|....

에 의해 그룹을 사용하여 최신 얻기는 쉽지만, 어떻게 여러 쿼리를 실행하지 않고도 최신 2를받을 수 있나요?

어떤 도움을 주셔서 감사합니다 ;-) 에스.

해결법

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

    1.여기서 당신은 친구를 간다!

    여기서 당신은 친구를 간다!

    SET @counter = 0;
    SET @category = '';
    
    SELECT
        *
    FROM
    (
        SELECT
            @counter := IF(data.category = @category, @counter+1, 0) AS counter,
            @category := data.category,
            data.*
        FROM
        (
            SELECT
                *
            FROM test
            ORDER BY category, date DESC
        ) data
    ) data
    HAVING counter < 2
    
  2. ==============================

    2.SQL에서 그룹 당 첫 번째 / 최소 / 최대 행을 선택하는 방법이 가장 문제를 다루는 뛰어난 심도있는 기사를 지시 응답되는 SQL에서 까다로운 문제입니다. 그것은 MySQL의 특정의이 일의 수단뿐만 아니라, 일반적인 방법을 설명합니다.

    SQL에서 그룹 당 첫 번째 / 최소 / 최대 행을 선택하는 방법이 가장 문제를 다루는 뛰어난 심도있는 기사를 지시 응답되는 SQL에서 까다로운 문제입니다. 그것은 MySQL의 특정의이 일의 수단뿐만 아니라, 일반적인 방법을 설명합니다.

  3. ==============================

    3.당신은 하나의 SELECT 문에서 쿼리의이 종류를 할 수 있기를하지 않을거야,하지만 당신은 다음 각 범주에 대한 임시 테이블에 하위 쿼리의 결과를 추가 복귀에 의해 반환 한 데이터를 설정하는 것이 하나의 저장 프로 시저를 마무리 할 수 ​​있습니다 임시 테이블의 내용을 표시합니다.

    당신은 하나의 SELECT 문에서 쿼리의이 종류를 할 수 있기를하지 않을거야,하지만 당신은 다음 각 범주에 대한 임시 테이블에 하위 쿼리의 결과를 추가 복귀에 의해 반환 한 데이터를 설정하는 것이 하나의 저장 프로 시저를 마무리 할 수 ​​있습니다 임시 테이블의 내용을 표시합니다.

    의사 코드 :

    Create a temp table
    For each distinct category,
      Add the last two records to the temp table
    Return the temp table
    

    당신은 당신이 결국 원하는 데이터의 집합을하게 될 겁니다, 그리고 응용 프로그램의 관점에서 하나 개의 쿼리가되었다.

  4. ==============================

    4.또 다른 방법은 GROUP_CONCAT를 사용하여 정렬 된 목록을 얻을 수 있습니다. 이것은 당신이 비록 많은 양의 데이터를 가지고 정말있는 경우 사용하지 않을 것입니다.

    또 다른 방법은 GROUP_CONCAT를 사용하여 정렬 된 목록을 얻을 수 있습니다. 이것은 당신이 비록 많은 양의 데이터를 가지고 정말있는 경우 사용하지 않을 것입니다.

    select group_concat(id order by insertdate desc separator ','), category from tablename group by category
    

    또는 하위 선택을 사용하여 (이 MySQL을)

    select category,
        (select id from test as test1 where test1.category = test.category order by insertdate desc limit 0,1) as recent1,
        (select id from test as test1 where test1.category = test.category order by insertdate desc limit 1,1) as recent2
    from test
    group by category;
    

    나는 서브 쿼리 그러나 그것은 내가 그것을 할 볼 수있는 유일한 방법입니다 있기 때문에 두 번째 옵션은 기술적으로 하나가 선택되지 않은 것을 알고있다.

  5. ==============================

    5.

    SELECT * 
    FROM category AS c1
    WHERE (
        SELECT COUNT(c2.id)
        FROM category AS c2
        WHERE c2.id = c1.id AND c2.insertdate > c1.insertdate
    ) < 2
    
  6. from https://stackoverflow.com/questions/1091991/how-to-get-the-latest-2-items-per-category-in-one-select-with-mysql by cc-by-sa and MIT license