[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.여기서 당신은 친구를 간다!
여기서 당신은 친구를 간다!
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.SQL에서 그룹 당 첫 번째 / 최소 / 최대 행을 선택하는 방법이 가장 문제를 다루는 뛰어난 심도있는 기사를 지시 응답되는 SQL에서 까다로운 문제입니다. 그것은 MySQL의 특정의이 일의 수단뿐만 아니라, 일반적인 방법을 설명합니다.
SQL에서 그룹 당 첫 번째 / 최소 / 최대 행을 선택하는 방법이 가장 문제를 다루는 뛰어난 심도있는 기사를 지시 응답되는 SQL에서 까다로운 문제입니다. 그것은 MySQL의 특정의이 일의 수단뿐만 아니라, 일반적인 방법을 설명합니다.
-
==============================
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.또 다른 방법은 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.
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
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
'SQL' 카테고리의 다른 글
[SQL] 인덱스 / 기본 키 순서에 대한 SQL 쿼리 (0) | 2020.07.17 |
---|---|
[SQL] 어떻게 오라클 REGEXP_REPLACE에 의해 공간이 구분 된 목록에서 중복을 제거하는 방법? [복제] (0) | 2020.07.17 |
[SQL] VBA에서 액세스 모듈에서 매개 변수를 전달하는 동안 저장 프로 시저를 호출 (0) | 2020.07.17 |
[SQL] PostgreSQL의 정렬 (0) | 2020.07.17 |
[SQL] BY 절 SQL GROUP에서 빈 그룹을 반환하는 방법 (0) | 2020.07.17 |