目录
- json字段查询
- 时间相关
- 只有日期
- 只有时间
- 又有时间又有日期
- 时间比较
- 时间运算
- 某字段同的取最新数据(软性的新数据覆盖旧数据查找)
- sql_mode=only_full_group_by的解决办法
- 优化思路
json字段查询
查询某个json字段(xx)的某个属性下的某个数组里的第n个元素的某个属性(究极叠buff版)
SELECT
JSON_EXTRACT(xx, '$.a.arr[0].b') AS first_element_name
FROM
table
时间相关
只有日期
SELECT CURDATE(),CURRENT_DATE(),CURRENT_DATE;
只有时间
SELECT CURTIME(),CURRENT_TIME(),CURRENT_TIME;
又有时间又有日期
SELECT NOW(),CURRENT_TIMESTAMP(),CURRENT_TIMESTAMP,LOCALTIME(),LOCALTIME,LOCALTIMESTAMP(),LOCALTIMESTAMP,SYSDATE();
其中SYSDATE()是执行当前函数的时间,NOW是执行当前sql的时间
时间比较
时间可以直接字符串比较
时间运算
INTERVAL来表示时间间隔,直接加
看起来nb,但是别用,这种加减运算就在代码里面算完再放进去效率比这样高
某字段同的取最新数据(软性的新数据覆盖旧数据查找)
SELECT t1.id,t1.batch,t1.pci,t1.count,t1.roadNumber,t1.date,t1.direction,t1.str_stake,t1.end_stake,t1.status,t1.roadType
FROM inspection t1
LEFT JOIN inspection t2
ON t1.roadNumber = t2.roadNumber AND t1.date < t2.date
WHERE t2.date IS NULL
sql_mode=only_full_group_by的解决办法
- 你要是能去掉这个mode当然最好,省的麻烦
- 我这边因为是在已有的数据库上进行修改,以防影响以前的代码只能采取别的措施,具体如下
比如我这边要搜索
SELECT
MAX(ins.pci) AS max_pci,
ins.roadNumber,
max(ins.date)
FROM inspection ins
GROUP BY ins.roadNumber
ORDER BY max_pci
优化思路
- 少写in,能用between就用between,少用除了=以外的比较符号
- 减少在语句中进行运算,尤其是上面那个时间计算
- 能别用select *就别用