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;