在实际开发中,手写以及查到的sql语句有很多,随着时间的流逝,很容易忘掉sql的语义,在这里特别汇总一下!( ̄ˇ ̄)
需求一:
功能:添加课程,选择开始、结束时间,拉取教室,教师信息。拉取的信息包含教师是否有课,教室是否占用以及占用的时间段。
===============================MYSQL=============================== | ||
SELECT IF( `u`.`realname` != '' , `u`.`realname`, `u`.`nickname` ) AS `name`, FROM_UNIXTIME( `c`.`starttime`, '%Y-%m-%d %T' ) AS `starttime`, FROM_UNIXTIME( `c`.`endtime`, '%T' ) AS `endtime`, IF( ( `c`.`starttime` >= 1553042040 AND `c`.`starttime` <= 1553049360 ) OR ( `c`.`starttime` `cl`.`roomname` FROM `users` AS `u` LEFT JOIN `course` AS `c` ON `u`.`uid` = `c`.`uid` AND ( ( `c`.`starttime` >= 1553042040 AND `c`.`starttime` <= 1553049360 ) OR ( `c`.`starttime` LEFT JOIN `classroom` AS `cl` ON `c`.`classroomid` = `cl`.`id` WHERE `u`.`oid` = 1 AND `u`.`roles` < 4 |
所用sql函数:
IF( 【条件】,【为真时执行】,【不符合条件时执行】 )
FROM_UNIXTIME( 【时间戳】,【转化后的时间格式】 )
常用时间格式: %Y 年, 数字, 4 位 %m 月, 数字(01……12) %d 月份中的天数, 数字(00……31) %T 时间,24 小时(hh:mm:ss) (更多时间格式,请点链接:https://www.cnblogs.com/xieqian111/p/5735952.html)
需求二:通过sql语句拉取树状结构数据。(只拉取三级)
听到这个需求时,第一反应时WTF??? 还有这种操作??? 咳咳咳 ~~~ 在通过百度时,发现有很多的案例,不过大多是用到sql自定函数解决,但是,老大给出的结论是不通过sql自定义函数也可以解决。最后,找到了两条可以解决的答案。(虽然有一条是我自认为可以在当前项目中用到的。。。)
先说第一条(自以为的⊙ω⊙,AND 也是查询速度最快的)。需求中,只要求拉取3级树状数据,而且应用的uses表中层级很明确,所以就是用多次连接同一张表查询。
===============================MYSQL=============================== | ||
SELECT `u`.`uid`, `u`.`nickname`, `u`.`refereesid`, `u1`.`uid` AS `aid`, `u1`.`nickname` AS `anickname`, `u1`.`refereesid` AS `are`, `u2`.`uid` AS `buid`, `u2`.`nickname` AS `bnickname` FROM `users` AS `u` LEFT JOIN `users` AS `u1` ON `u.`refereesid` = `u1`.`uid` LEFT JOIN `users` AS `u2` ON `u1`.`refereesid` = `u2`.`uid` WHERE `u`.`uid` = 1 |
然而这样获取的数据只有一行,以及需要大量的重民名。如果是要拉取整条树的数据呢?
第二条,通过设置sql全局变量来达到目的
===============================MYSQL=============================== | ||
SELECT `t`.`level` + 1 AS level, `u`.* FROM ( SELECT @uid as `_uid`, ( SELECT @uid := `refereesid` FROM `uzp_users` WHERE `uid` = @uid order by `refereesid` desc ) _refereesid, @l := @l-1 as `level` FROM `uzp_users` , ( select @uid := 23, @l := 3 ) b where @uid >0 AND @l > 0 ) `t`, `uzp_users` as `u` where `t`.`_uid` = `u`.`uid` |
知识点:
1、sql子句的别名可以省去`as`关键字
2、SELECT语句中,子查询总是由内向外处理的。所以在处理读sql语句时,先看内部子查询。
3、sql全局变量,`@变量名` 来声明, 通过 @id := 0 赋值