一、开发总结
1.1 数据库设计
在数据库设计上一些字段没有做到见名知意
表中自己的字段前加上表名的首字母和下划线比如菜品表中菜品的名称正确的字段名称应该是name但是我在命名的时候命名为v_name(这是没必要的)一个表自己的字段必须要再加前缀
在spme框架中,任何一个表中都必须有create_time(创建时间)、update_time(修改时间)、is_deleted(逻辑删除)、create_by(创建者id)、update_by(更新着id),注意这里所有时间的类型都是datetime
1.2 菜品分配
需求:在菜品分配详情页面显示已经分配给大宗用户的菜品和未分配给大宗用户的菜品,给具体某个大宗用分配菜品,以及查询每个大宗用户的创建时间更新时间和菜品数量
1.2.1 查询没各大宗用户的创建时间更新时间和菜品数量
这里的创建时间是大宗用户所在部门的创建时间,更新时间是菜品分配的最新时间,也就是最近一次的分配时间,如果没有给该机构分配菜品那么菜品分配数量就显示0,更新时间就是什么都不显示。
难点:
- 查询每个机构分配的菜品数量是没有办法进行联表查询的
- 菜品的更新时间有很多,但是只能返回一条时间最新的数据,而且也没有办法进行联表查询
解决方案:
-
对于上面两个没法进行联表查询的状况都可以通过子查询来解决,将查询到的数量和最新时间作为一条数据返回
-
关于时间的问题有两个解决方案
- 在子查询中对时间进行降序排序,然后通过limit 1,1 来选取最大的那个时间
- 是在每次添加菜品时(由于前端组件的需要,每次重新分配菜品时都需要将之前分配的菜品全部删除然后重新添加)将菜品的时间都设为同一个值——now()这样在进行子查询的时候就不需要排序,只需要limit 1,1 即可
子查询按位置可以分为四类:
- 标量子查询:结果集只有一行一列,一般可作为查询结果或者查询条件,一般在select后面(select后面仅仅支持标量子查询),也可以出现在where或having后面
- 列子查询:结果集只有一行多列,只能作为查询条件,位于where或having后面
- 行子查询:结果集只有一行多列,只能作为查询条件,位于where或having后面
- 表子查询:结果集一般为多行多列,位于exists或from后面
本需求中需要作为查询结果,所以使用的是标量子查询
@Select("SELECT dept.id,dept.`name`,dept.create_time,( \n" +
"SELECT COUNT(*) \n" +
"FROM allocation a \n" +