安恒实习
公司项目
信息发布模块
Mysql报this is incompatible with sql_mode=only_full_group_by错误
问题原因
这个错误发生在mysql 5.7 版本及以上版本会出现的问题:
mysql 5.7版本默认的sql配置是:sql_mode="ONLY_FULL_GROUP_BY",这个配置严格执行了"SQL92标准"。
很多从5.6升级到5.7时,为了语法兼容,大部分都会选择调整sql_mode,使其保持跟5.6一致,为了尽量兼容程序。
复制代码
问题原理
在sql执行时,出现该原因:
简单来说就是:输出的结果是叫target list,就是select后面跟着的字段,还有一个地方group by column,就是
group by后面跟着的字段。由于开启了ONLY_FULL_GROUP_BY的设置,所以如果一个字段没有在target list
和group by字段中同时出现,或者是聚合函数的值的话,那么这条sql查询是被mysql认为非法的,会报错误。
解决方式
我采用的是临时解决方案,永久解决方案需要修改my.ini里的sql_mode,zip安装的版本没有此文件,需要按网上教程自己创建一个My.ini然后重新创建服务。 临时解决方案:用sql语句临时修改 set @@GLOBAL.sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
; 注:此方法能直接解决问题,但在mysql重启后会无效。
点击对应功能返回500状态码
原因
由于项目调用的接口位于不同模块,该功能调用的接口位于另一个模块,尽管模块已启动,但是查看调用的接口后发现未配置到nginx中,于是根据项目启动的端口重新配置nginx,重启nginx后正常。
拓展学习
遇到的大坑
关于在List<List<>>类型的对象中调用add()方法
public void test() {
List<String> tem = new ArrayList<>();
List<List<String>> lists = new ArrayList<>();
lists.add(tem); //注意这里如果直接添加tem,后续如果有对tem的操作,同样会修改添加进lists里的tem对象。
}
复制代码
因此应该改为
lists.add(new ArrayList<>(tem));
复制代码
创建新的对象添加进lists中,后续对tem的修改不会影响lists中的对象。
每日一题
338.比特位计数
题目
给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。
示例 1:
输入: 2 输出: [0,1,1] 示例 2:
输入: 5 输出: [0,1,1,2,1,2]
思路
这个类型的题目如果采用转换 -> 遍历的方式时间复杂度是O(n^2),由于是计算1的数量,可以尝试位运算达到一次遍历就解决问题的目的。一个数字n和n-1进行与运算,可以消除掉最右边的'1',而对于n-1,n中1的个数就是n-1中1的个数加一,因此我们只需要求n-1中1的个数。题目也就变成了一个类递归问题。
代码
public static int[] countBits(int num) {
int[] res = new int[num+1];
for(int i = 1; i <= num; i++) {
res[i] = res[i & i - 1] + 1;
}
return res;
}
复制代码
40组合总和II
题目
给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的每个数字在每个组合中只能使用一次。
说明:
所有数字(包括目标数)都是正整数。 解集不能包含重复的组合。 示例 1:
输入: candidates = [10,1,2,7,6,1,5], target = 8, 所求解集为: [ [1, 7], [1, 2, 5], [2, 6], [1, 1, 6] ]
思路
题目不难,遍历数组进行递归,如果初始值大于target直接返回,
代码
class Solution {
public List<List<Integer>> combinationSum2(int[] candidates, int target) {
Arrays.sort(candidates);
List<List<Integer>> lists = new ArrayList<>();
List<Integer> tem = new ArrayList<>();
util(candidates, target, 0,lists,tem,0);
return lists;
}
public static void util(int[] candidates, int target, int start, List<List<Integer>> lists, List<Integer> tem, int i) {
for(int j = i; j < candidates.length; j++) {
start += candidates[j];
if(start > target) {
start -= candidates[j];
break;
}
if(start == target) {
tem.add(candidates[j]);
if(!lists.contains(tem))
lists.add(new ArrayList<>(tem));
start -= candidates[j];
tem.remove(tem.size() - 1);
break;
}
if(start < target) {
tem.add(candidates[j]);
util(candidates, target, start, lists, tem, j+1);
tem.remove(tem.size() - 1);
start -= candidates[j];
}
}
}
}
复制代码
转载于:https://juejin.im/post/5cf8697251882539c33e4d6b