一、关于group by的使用
在部分mysql版本(5.7.xx及以上)中,若select的列中,包含了未被group by的字段,会报以下错误:
[Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'xxxx' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
错误原因是mysql这个版本之后的mysql默认开启了only_full_group_by模式。
有以下几个解决思路:
1、若无法修改sql_mode(大部分情况下,公司与客户不会允许修改),可选择以下方案:
修改SQL语句,在group by子句中将需要select的列都写上。(此方法需要注意,group by子句都加上select的列后,执行结果是否一致,大概率是不一致,查询结果会多分很多组,不推荐)
通过拆分成多个查询语句,如需要group by的语句单独一行,再写一个新语句进行后续查询
2、修改sql_mode(方法很多,改配置文件或者直接在mysql中设置均可,百度操作步骤)
二、在原生sql语句中,将某些变量放入执行语句中
# 查询某段时间内的一些数据
start_time = '2021-09-01 00:00:00.000'
end_time = '2022-09-25 23:59:59.999'
cursor.execute(
"SELECT b.username,COUNT(*),b.userid FROM review a LEFT JOIN users b ON a.creater_id = b.userid \
WHERE a.create_time BETWEEN %s AND %s GROUP BY b.userid,b.username ORDER BY COUNT(*) \
DESC;", (start_time, end_time))
三、在原生sql语句中,使用in时
# 查询某些数据,user_id IN 某个列表
user_id_list = [1,2,3]
sql_str = "SELECT DISTINCT u.user_id,r.role_name FROM user_role_con u LEFT JOIN \
role r ON u.role_id = r.role_id WHERE u.user_id IN %s;"
# 把该列表拼成一个元素,作为参数传入即可
cursor.execute(sql_str, (user_id_list,))
user_role_name = cursor.fetchall()
标签:语句,group,Python,sql,PyMySQL,role,user,注意事项,id
From: https://www.cnblogs.com/chiyun/p/17653609.html