1. 程式人生 > >mysql的group by用法在5.7和5.6中存在區別

mysql的group by用法在5.7和5.6中存在區別

http://stackoverflow.com/questions/39909261/order-by-before-group-by-in-subquery-working-in-mysql-5-5-but-not-in-mysql-5-7

http://stackoverflow.com/questions/34115174/i-am-getting-an-error-in-mysql-related-to-only-full-group-by-when-executing-a-qu

http://stackoverflow.com/questions/12113699/get-top-n-records-for-each-group-of-grouped-results,文章中寫的參考例子都是獲取到分組中的前兩條記錄,我們只要一條記錄,把<=2改為<2即可

原來在5.6及其以下可以使用select * from(select * from table order by 排序欄位) group by 欄位,這種寫法來得到分組需要的第一條記錄,然而在5.7中子查詢的排序條件會被忽略掉,暫時沒有通過修改配置就可以解決的方案,只能參考demo自己改寫sql語句,按照大神Drew的原句是我們原來的這種寫法It is just sloppy programming.

第一種改寫的辦法:直接就是查出需要的ID再聯查

第二種改寫的辦法就是新增變數

SELECT
    person,
    groupname,
    age
FROM(SELECT
        person
, groupname, age,@rn :=IF(@prev = groupname,@rn +1,1)AS rn,@prev := groupname FROM mytable JOIN(SELECT@prev :=NULL,@rn :=0)AS vars ORDERBY groupname, age DESC, person )AS T1 WHERE rn <=2

參照這個寫法即

select * from(select *,@rn := IF(@prev = groupname, @rn + 1, 1) AS rn, @prev := groupname from table  join(select @prev:=NULL,@rn:=0) AS vars order by groupname,其它排序欄位) group by groupname where rn<2

第三種改寫的方法就是在where條件中聯查自己過濾

SELECT a.person, a.group, a.age FROM person AS a WHERE(SELECT COUNT(*)FROM person AS b 
WHERE b.group= a.groupAND b.age >= a.age)<=2ORDERBY a.groupASC, a.age DESC
select * from table AS a WHERE (select (count(*) from table AS b where a.groupname=b.groupname AND 滿足特定的條件(b.updatetime>=a.updatetime)))<2 order by 排序條件

第四種改寫的方法和第三種的原理類似,也是自己聯查自己,只是不需要子查詢,通過having條件來過濾

SELECT a.*FROM mytable AS a
  LEFTJOIN mytable AS a2 
    ON a.groupname = a2.groupname AND a.age <= a2.age
GROUPBY a.person
HAVING COUNT(*)<=2ORDERBY a.groupname, a.age DESC;