DESC 순서에 따라 그룹화하는 방법
질문이라는 표가 있습니다.
ID | asker
1 | Bob
2 | Bob
3 | Marley
각 질문자를 한 번만 선택하고 동일한 이름의 질문자가 여러 명일 경우 가장 높은 ID 중 하나를 선택합니다.따라서 예상되는 결과는 다음과 같습니다.
ID | asker
3 | Marley
2 | Bob
다음 쿼리를 사용합니다.
SELECT * FROM questions GROUP by questions.asker ORDER by questions.id DESC
다음과 같은 결과가 나타납니다.
ID | asker
3 | Marley
1 | Bob
마지막 '밥' 대신 처음 만나는 '밥'을 선택합니다.
당신이 마지막을 원한다면,id
자의에 asker
그런 다음 집계 함수를 사용해야 합니다.
SELECT max(id) as id,
asker
FROM questions
GROUP by asker
ORDER by id DESC
이 MySQL의 를 입니다.GROUP BY
선택 목록의 항목을 집계하지 않고 GROUP BY 절에 포함하지 않을 수 있습니다.그러나 MySQL은 반환되는 값을 선택할 수 있기 때문에 예상치 못한 결과가 발생할 수 있습니다.(그룹화 기준으로 MySQL 확장 참조)
MySQL 문서에서:
MySQL은 선택 목록이 GROUP BY 절에 이름이 지정되지 않은 집계되지 않은 열을 참조할 수 있도록 GROUP BY의 사용을 확장합니다. ...이 기능을 사용하면 불필요한 열 정렬 및 그룹화를 방지하여 성능을 향상시킬 수 있습니다.그러나 GROUP BY에 이름이 지정되지 않은 각 집계되지 않은 열의 모든 값이 각 그룹에 대해 동일한 경우에 주로 유용합니다.서버는 각 그룹에서 임의의 값을 선택할 수 있으므로, 동일하지 않은 경우 선택한 값은 결정되지 않습니다.또한 ORDER BY 절을 추가해도 각 그룹의 값 선택에 영향을 줄 수 없습니다.결과 집합 정렬은 값이 선택된 후에 수행되며, ORDER BY는 서버가 선택한 값에 영향을 주지 않습니다.
에는 다음과 같습니다.GROUP BY
일치하지 않는 결과를 얻을 수 있기 때문에 하위 쿼리를 사용할 수 있습니다. (데모)
select
q.Id,
q.asker,
q.other -- add other columns here
from questions q
inner join
(
-- get your values from the group by
SELECT max(id) as id,
asker
FROM questions
GROUP by asker
) m
on q.id = m.id
order by q.id desc
일반적으로 MySQL은 오름차순 레코드로만 그룹화를 허용합니다.그래서 우리는 그룹화하기 전에 레코드를 주문할 수 있습니다.
선택*시작(선택*질문에서ID별 주문 설명) AS 질문질문별로 그룹화합니다. 질문
GROUP BY와 MAX에서 사용되는 열만 정확하게 선택하는 경우에만 @Taryn의 수락된 답변의 첫 번째/짧은 대안이 작동하기 때문에 이 답변을 작성합니다.사용자가 묻는 질문은 테이블의 모든 열을 선택하는 것입니다(SELECT * 사용).따라서 테이블에 다른 세 번째 열을 추가하면 쿼리 결과의 열 값이 올바르지 않습니다.여러 테이블 행에서 혼합된 값을 얻을 수 있습니다.@Taryn의 두 번째/더 긴 대안(내부 조인 및 하위 쿼리 사용)은 작동하지만 쿼리는 쓸데없이 복잡하며 아래의 간단한 대안보다 사용 사례에서 5배 느립니다.
고려표questions
:
id | asker
-----------
1 | Bob
2 | Bob
3 | Marley
쿼리SELECT max(id) as id, asker FROM questions GROUP BY asker ORDER BY id DESC
반환 예상:
id | asker
-----------
3 | Marley
2 | Bob
이제 다른 테이블을 고려합니다.questions
:
id | asker | other
-------------------
1 | Bob | 1st
2 | Bob | 2nd
3 | Marley | 3rd
쿼리SELECT max(id) as id, asker, other FROM questions GROUP BY asker ORDER BY id DESC
예기치 않은 반환:
id | asker | other
-------------------
3 | Marley | 3rd
2 | Bob | 1st
의 가치에 주목합니다.other
두 번째 결과 행이 올바르지 않습니다. 다음 이유로 인해id=2
테이블의 두 번째 열에서 나오지만,other=1st
테이블의 첫 번째 줄에서 옵니다!이는 Taryn의 답변에 대한 많은 사용자들이 이 솔루션이 작동하지 않는다고 보고한 것입니다.
사용할 다른 열도 선택할 때 가능한 간단한 해결책GROUP BY
+DESC
:
SELECT id, asker, other FROM questions GROUP BY asker DESC
id | asker | other
-------------------
3 | Marley | 3rd
2 | Bob | 2nd
(데모 참조: https://www.db-fiddle.com/f/esww483qFQXbXzJmkHZ8VT/10)
그러나 이 간단한 솔루션에는 몇 가지 제한이 있습니다.
- 테이블은 InnoDB여야 합니다(MySQL >= 5.5.5 기본/기본 스토리지 엔진이 MyISAM에서 InnoDB로 변경되었기 때문에 더 나은 성능을 얻을 수 있기 때문에 문제가 없다고 생각합니다.
- GROUP BY에서 사용되는 열에 대한 인덱스를 만들어야 합니다.
asker
이 경우 (인덱스가 적합하기 때문에 성능이 더 좋아질 것이기 때문에 문제가 없다고 생각합니다.GROUP BY는 일반적으로 tmp 테이블을 생성해야 하지만 인덱스를 사용할 수 있는 경우 tmp 테이블이 생성되지 않으므로 더 빠름) - MySQL 5.7 및 8.0의 경우 SQL 모드 ONLY_FULL_GROUP_BY를 사용하지 않도록 설정해야 합니다(예:
SET SESSION sql_mode = '';
) 또는 사용ANY_VALUE()
오류 ER_WRONG_FIELD_를 방지하기 위해 집계되지 않는 선택된 열에 대해WITH_GROUP. - 불행히도 MySQL 개발자들은 MySQL 8.0 https://dev.mysql.com/worklog/task/ ?id=8693 이후 GROUP BY로 ASC/DESC 지원을 제거했지만 다행히도 대안이 있습니다.
GROUP BY col1 ORDER BY col1 ASC/DESC
:
SELECT id, asker, other FROM questions GROUP BY asker ORDER BY asker DESC
id | asker | other
-------------------
3 | Marley | 3rd
2 | Bob | 2nd
(데모 참조: https://www.db-fiddle.com/f/esww483qFQXbXzJmkHZ8VT/11)
결과는 위와 같습니다.GROUP BY ... DESC
(InnoDB를 사용하고 인덱스를 생성하는 것을 잊지 마십시오.)
레코드는 다음을 사용하여 그룹화해야 합니다.GROUP BY
그리고.MAX()
모든 사용자에 대한 최대 ID를 가져옵니다.asker
.
SELECT asker, MAX(ID) ID
FROM TableName
GROUP BY asker
산출량
╔════════╦════╗
║ ASKER ║ ID ║
╠════════╬════╣
║ Bob ║ 2 ║
║ Marley ║ 3 ║
╚════════╩════╝
다른 것들은 MAX(ID)를 사용하여 원하는 결과를 얻는 것에 대해 정확합니다.쿼리가 작동하지 않는 이유가 궁금하다면 다음과 같은 이유입니다.ORDER BY
다음에 발생합니다.GROUP BY
.
왜냐하면.ORDER BY
다음 시간 이후에 수행됩니다. GROUP BY
.
사용해 보십시오.
SELECT * FROM questions
WHERE id IN
(
SELECT max(id) as id
FROM questions
GROUP by asker
ORDER by id DESC
)
모든 열을 가져오는 방법
SELECT * FROM questions
WHERE id IN
(SELECT max(id) as id, asker
FROM questions
GROUP by asker
ORDER by id DESC)
@bluefeet의 답변의 개선된 버전입니다.
언급URL : https://stackoverflow.com/questions/15390303/how-to-group-by-desc-order
'sourcecode' 카테고리의 다른 글
jQuery: 요소의 클래스와 ID를 동시에 선택하시겠습니까? (0) | 2023.08.22 |
---|---|
숫자를 정렬된 숫자 배열에 삽입하는 효율적인 방법은 무엇입니까? (0) | 2023.08.22 |
마리아드브는 짐을 싣고 몇 분 후에 추락합니다.서버가 "스냅샷"에서 복원된 후 발생했습니다. (0) | 2023.08.22 |
jQuery 셀렉터에서 $(이것)를 제외하려면 어떻게 해야 합니까? (0) | 2023.08.22 |
Oracle 가동 시간 쿼리 (0) | 2023.08.22 |