지난 1년 동안 업무상 NoSql 데이터베이스를 주로 사용했는데, 관계형 데이터베이스가 점점 낯설게 느껴집니다. 하나는 group by
와 order로 구성되어 있습니다. by
이것이 살인으로 이어졌습니다. 긴급 상황에 대비해 여기에 메모를 남겨두세요. group by
和order by
引发的血案由此而生。在此做个记录,以备不时之需。
首先,看一下整体的mysql에서 group by와 order by를 동시에 사용하는 잘못된 대안。
现在查找每个barCode
中最新的数据。
由于数据太多,不是很好看到效果。我们就拿一个barCode
为4565789
的数据做示例。
SELECTbarCode, priCommodityID, createDateFROMtb_history_versionWHEREbarCode = '4565789'ORDER BYcreateDate DESC;
由于很久没有写过sql了。所以首先想到了用 group by和order by组合查询。
SELECTbarCode, priCommodityID, createDateFROMtb_history_versionWHEREbarCode = '4565789'GROUP BYbarCodeORDER BYcreateDate DESC;
结果如下:
可以看到这并不是我们想要的结果,order by
没有任何效果。
接下来就试一下运用子查询的方式将两者结合。先排序再分组
SELECT*FROM(SELECTbarCode, priCommodityID, createDateFROMtb_history_versionWHEREbarCode = '4565789'ORDER BYcreateDate DESC) AS AGROUP BYA.barCode;
结果还是令人失望的
上面两种方式试过了,虽然结果让人伤心,但是工作还是要继续。于是就网上找各种资料,看能否用其他方式解决问题。偶然间看到了group_concat
可以实现分组排序,就拿来试一试
SELECTbarCode, GROUP_CONCAT( priCommodityIDORDER BYcreateDate DESC) AS priCommodityID, GROUP_CONCAT( createDateORDER BYcreateDate DESC) AS createDateFROMtb_history_versionWHEREbarCode = '4565789';
结果如下
可以看到顺序没问题了,但是所有数据都被拼接在一起了。需要进一步做截取字符的处理
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;
ok!到这里就发现已经实现我们刚开始的需求了。
group by
和order by
同时使用是没有效果的,可以使用group_concat
和groub by
替代。group_concat
이제 각 바코드 /를 찾아보세요 코드>최신 데이터입니다.
barCode
가 4565789
인 데이터를 예로 들어보겠습니다. order by
는 아무런 효과가 없습니다. 🎜다음으로 하위 쿼리를 사용하여 두 가지를 결합해 보겠습니다. 먼저 정렬한 다음 그룹화하세요🎜group_concat
이 그룹 정렬을 할 수 있다는 걸 보고 시도해 봤습니다🎜group by
와 order by
를 동시에 사용하면 효과가 없습니다. group_concat
및 group by를 사용할 수 있습니다.
대체. 필드 정렬은 group_concat
에서 구현할 수 있습니다. 🎜🎜참고기사🎜🎜🎜🎜🎜초기주소🎜🎜http://www.devzxd.top/2017/05/27/mysql-groupby-orderby.html🎜위 내용은 mysql에서 group by와 order by를 동시에 사용하는 잘못된 대안의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!