>  기사  >  데이터 베이스  >  mysql에서 group by와 order by를 동시에 사용하는 잘못된 대안

mysql에서 group by와 order by를 동시에 사용하는 잘못된 대안

巴扎黑
巴扎黑원래의
2017-06-23 11:10:123237검색

머리말

지난 1년 동안 업무상 NoSql 데이터베이스를 주로 사용했는데, 관계형 데이터베이스가 점점 낯설게 느껴집니다. 하나는 group byorder로 구성되어 있습니다. by 이것이 살인으로 이어졌습니다. 긴급 상황에 대비해 여기에 메모를 남겨두세요. group byorder by 引发的血案由此而生。在此做个记录,以备不时之需。

需求

首先,看一下整体的mysql에서 group by와 order by를 동시에 사용하는 잘못된 대안。
mysql에서 group by와 order by를 동시에 사용하는 잘못된 대안
现在查找每个barCode中最新的数据。

由于数据太多,不是很好看到效果。我们就拿一个barCode4565789的数据做示例。

SELECTbarCode,
    priCommodityID,
    createDateFROMtb_history_versionWHEREbarCode = '4565789'ORDER BYcreateDate DESC;

mysql에서 group by와 order by를 동시에 사용하는 잘못된 대안

试错

由于很久没有写过sql了。所以首先想到了用 group by和order by组合查询。

SELECTbarCode,
    priCommodityID,
    createDateFROMtb_history_versionWHEREbarCode = '4565789'GROUP BYbarCodeORDER BYcreateDate DESC;

结果如下:
mysql에서 group by와 order by를 동시에 사용하는 잘못된 대안
可以看到这并不是我们想要的结果,order by没有任何效果。
接下来就试一下运用子查询的方式将两者结合。先排序再分组

SELECT*FROM(SELECTbarCode,
            priCommodityID,
            createDateFROMtb_history_versionWHEREbarCode = '4565789'ORDER BYcreateDate DESC) AS AGROUP BYA.barCode;

结果还是令人失望的
mysql에서 group by와 order by를 동시에 사용하는 잘못된 대안

解决

上面两种方式试过了,虽然结果让人伤心,但是工作还是要继续。于是就网上找各种资料,看能否用其他方式解决问题。偶然间看到了group_concat可以实现分组排序,就拿来试一试

SELECTbarCode,
    GROUP_CONCAT(
        priCommodityIDORDER BYcreateDate DESC) AS priCommodityID,
    GROUP_CONCAT(
        createDateORDER BYcreateDate DESC) AS createDateFROMtb_history_versionWHEREbarCode = '4565789';

结果如下
mysql에서 group by와 order by를 동시에 사용하는 잘못된 대안
可以看到顺序没问题了,但是所有数据都被拼接在一起了。需要进一步做截取字符的处理

SELECTbarCode,
    SUBSTRING_INDEX(
        group_concat(
            priCommodityIDORDER BYcreateDate DESC),',',1) AS priCommodityID,
    SUBSTRING_INDEX(
        group_concat(
            createDateORDER BYcreateDate DESC),',',1) AS createDateFROMtb_history_versionWHEREbarCode = '4565789'GROUP BYbarCode;

mysql에서 group by와 order by를 동시에 사용하는 잘못된 대안
ok!到这里就发现已经实现我们刚开始的需求了。

总结

group byorder by同时使用是没有效果的,可以使用group_concatgroub by替代。group_concat

Requirements

먼저 전체 테이블 구조를 살펴보세요.


이제 각 바코드 /를 찾아보세요 코드>최신 데이터입니다.

데이터가 너무 많아서 효과가 별로 좋지 않네요. barCode4565789인 데이터를 예로 들어보겠습니다.

rrreee

예 Data

🎜시행착오🎜🎜오랫동안 SQL을 작성하지 않았기 때문입니다. 그래서 처음에는 그룹별 및 순서별 조합 쿼리를 사용하는 것을 생각했습니다. 🎜
rrreee
🎜결과는 다음과 같습니다: 🎜오류 결과: 1🎜 이것이 우리가 원하는 결과가 아니라는 것을 알 수 있습니다. order by는 아무런 효과가 없습니다. 🎜다음으로 하위 쿼리를 사용하여 두 가지를 결합해 보겠습니다. 먼저 정렬한 다음 그룹화하세요🎜
rrreee
🎜결과는 여전히 실망스럽습니다🎜🎜🎜Solution🎜🎜위 두 가지 방법을 시도해 봤습니다. 결과가 안타깝지만 작업은 계속되어야 합니다. 그래서 다른 방법으로 문제를 해결할 수 있는지 알아보기 위해 온라인에서 다양한 정보를 검색했습니다. 우연히 group_concat이 그룹 정렬을 할 수 있다는 걸 보고 시도해 봤습니다🎜
rrreee
🎜결과는 다음과 같습니다🎜Result 1🎜순서는 괜찮은데 모든 데이터가 접합되어 있는 것을 볼 수 있습니다 ​함께. 문자 가로채기 추가 처리가 필요합니다🎜
rrreee
🎜정확한 결과🎜알겠습니다! 이 시점에서 우리는 초기 요구 사항이 달성되었음을 확인했습니다. 🎜🎜요약🎜🎜 group byorder by를 동시에 사용하면 효과가 없습니다. group_concatgroup by를 사용할 수 있습니다. 대체. 필드 정렬은 group_concat에서 구현할 수 있습니다. 🎜🎜참고기사🎜🎜🎜🎜🎜초기주소🎜🎜http://www.devzxd.top/2017/05/27/mysql-groupby-orderby.html🎜

위 내용은 mysql에서 group by와 order by를 동시에 사용하는 잘못된 대안의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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