>  기사  >  데이터 베이스  >  MySQL에서 count(), group by, order by의 구체적인 사용법에 대한 자세한 설명

MySQL에서 count(), group by, order by의 구체적인 사용법에 대한 자세한 설명

黄舟
黄舟원래의
2017-05-28 09:56:432653검색

mysqlorder by sortquery, asc 오름차순, desc 내림차순, group by groupingquery이며, 갖는 것은 절별로 그룹 내에서만 사용할 수 있고 그룹 내에서 동작합니다. 절은 함수 표현식 바로 뒤에 올 수 있습니다. group by 절을 사용하는 쿼리 문은 aggregation 함수를 사용해야 합니다.

최근 IM을 하다가 문제가 생겼는데, 이 세 가지 키워드가 동시에 사용됐어요. 개인의 오프라인 메시지 세부 정보를 쿼리하는 것입니다. 서버에서 클라이언트로 반환하는 세부 정보에는 세 가지 내용이 포함됩니다. 첫 번째는 오프라인 기간 동안 어떤 사람이나 그룹이 메시지를 보냈는지 나열해야 합니다. 특정 개인이나 그룹이 오프라인 메시지를 보냈는데, 세 번째는 가장 최근 메시지를 꺼내서 표시하는 것입니다. 당연히 오프라인 메시지를 보낸 사람이나 그룹이 그룹별로 그룹화하고, count()는 오프라인 메시지 수를 가져오고, 순서는 시간별로 최신 메시지를 정렬합니다.

select count(1) as cnt, msg_data from t_im_chat_offline_msg where to_company_id = ? and to_user_id = ? order by create_time desc group by from_company_id, from_user_id;

그러면 예상대로 group by와 order by를 함께 검색하면 오류가 보고됩니다. 중첩된 하위 쿼리를 사용할 수 있습니다.

select count(1) as cnt, msg_data from (select * from t_im_chat_offline_msg where to_company_id = ? and to_user_id = ? order by create_time desc) as temp_table group by from_company_id, from_user_id;

정렬된 결과 집합을 그룹화하고 수량을 계산할 수 있습니다. 여기에는 실수로 피한 또 다른 숨겨진 구덩이가 있습니다. 실제로 count()를 사용하면 정렬 순서가 유효하지 않게 됩니다. 예:

select count(1) as cnt, msg_data from t_im_chat_offline_msg where to_company_id = ? and to_user_id = ? order by create_time desc;

이 명령문으로 얻은 마지막 레코드에는 실제로 msg_data가 없습니다. 정렬 결과, 즉 데이터베이스의 원래 순서가 가장 먼저 삽입된 메시지, 즉 시간이 가장 오래된 메시지가 되어야 합니다. 이 문제를 피하기 위해 중첩된 하위 쿼리를 여기에서 먼저 정렬한 다음 count()를 사용하여 이를 방지합니다. 본의 아니게 탈출했는데, 문장을 바꾸고 테스트를 거듭하다 보니 운 좋게 알게 됐어요.

위 내용은 MySQL에서 count(), group by, order by의 구체적인 사용법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.