如何查找一个月内到期的数据?
查询一个月内到期的学生。
这里需要用到一个DiffDate时间函数。查了一下其功能
分析问题:
1.一个月内到期的就是到期时间与当前时间天数之差小于等于30天
先把所有的天数差查出来
SELECT DATEDIFF(enddate,NOW()) AS DiffDate,s.* FROM students s
2.然后条件查询
错误做法:
SELECT DATEDIFF(enddate,NOW()) AS DiffDate,s.* FROM students s WHERE DiffDate BETWEEN 0 AND 30
这样是不行的,因为DiffDate不是students表里的一个字段
3.可以把查询出来的结果当成一个表,然后再从这个表里查数据
SELECT a.* FROM
(SELECT DATEDIFF(enddate,NOW()) AS DiffDate,s.* FROM students s) AS a //当成a表
WHERE a.DiffDate BETWEEN 0 AND 30
方法二:今天老师讲了这个,有更简单的sql语句
SELECT * FROM students WHERE enddate <= (DATE_ADD(NOW(),INTERVAL +1 MONTH))
根据到期日期小于当前日期加上一个月的时间
https://www.w3school.com.cn/sql/func_date_add.asp
如何把两个字段放到一个字段里?
业务:显示一下列表
student表
classes表
stuexpendstime表
subject表
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210126200912650.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lqM
TIzYWI=,size_16,color_FFFFFF,t_70)
无非就是围绕这三个表查询,年级需要连接查询。这里的课程是一个学生报多个课程。课程名是一个学生的所有的课程名,缴费金额是一个学生报课程的所有缴费金额。
这里查询分两步。
1.我们先查询stuexpendstime表和年级表已经学生表
SELECT *,SUM(t.`subjectMoney`) money FROM students s LEFT JOIN classes c ON s.`classesid` = c.`cid` LEFT JOIN stuexpendstime t
ON s.`sid` = t.`studentid` GROUP BY s.`sid`
已经把学生信息,年级,缴费总金额查询出来了。
2.查询subject表和stuexpendstime表
SELECT t.`studentid`,GROUP_CONCAT(sub.subjectname) subjectNames FROM stuexpendstime t LEFT JOIN SUBJECT sub ON t.`subjectid` = sub.subjectid
GROUP BY t.`studentid`
3.两表连接查询
SELECT * FROM
(
SELECT *,SUM(t.`subjectMoney`) money FROM students s LEFT JOIN classes c ON s.`classesid` = c.`cid` LEFT JOIN stuexpendstime t
ON s.`sid` = t.`studentid` GROUP BY s.`sid`
)
stu LEFT JOIN
(
SELECT t.`studentid`,GROUP_CONCAT(sub.subjectname) subjectNames FROM stuexpendstime t LEFT JOIN SUBJECT sub ON t.`subjectid` = sub.subjectid
GROUP BY t.`studentid`
) sub ON stu.sid = sub.studentid
查询成功
拓展:
一 concat()函数
1、功能:将多个字符串连接成一个字符串。
2、语法:concat(str1, str2,…)
返回结果为连接参数产生的字符串,如果有任何一个参数为null,则返回值为null。
3、语法:concat(str1, seperator,str2,seperator,…)
返回结果为连接参数产生的字符串并且有分隔符,如果有任何一个参数为null,则返回值为null。
二 concat_ws()函数
1、功能:和concat()一样,将多个字符串连接成一个字符串,但是可以一次性指定分隔符(concat_ws就是concat with separator)
2、语法:concat_ws(separator, str1, str2, …)
说明:第一个参数指定分隔符。需要注意的是分隔符不能为null,如果为null,则返回结果为null。
三 group_concat()函数
1、功能:将group by产生的同一个分组中的值连接起来,返回一个字符串结果。
2、语法:group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator ‘分隔符’] )
说明:通过使用distinct可以排除重复值;如果希望对结果中的值进行排序,可以使用order by子句;separator是一个字符串值,缺省为一个逗号。