<sql id="queryUserAndDept"> select s.*,deptName from sysuser s,dept d where s.deptId = d.deptId and del = 0 </sql>
时间: 2024-06-01 14:08:03 浏览: 151
这是一段 SQL 查询语句,用于查询系统用户和他们所在的部门名称。具体来说,它使用了两个表:sysuser(系统用户表)和 dept(部门表),并通过 deptId 字段将它们进行了连接。查询条件包括 del 字段等于 0,即未被删除的用户。查询结果包括 sysuser 表中的所有字段以及 dept 表中的 deptName 字段。
相关问题
SELECT t.id AS userId, t1.user_name AS userName, t.create_time AS createTime, t1.login_id AS loginId, t1.mobile_phone AS mobilePhone, t.user_status AS userStatus, t1.mailbox AS mailbox, t1.dept_id AS deptId, t3.dept_name AS deptName FROM sys_user t LEFT JOIN sys_user_info t1 ON (t1.login_id = t.login_id) left join sys_dept t3 ON (t1.dept_id = t3.dept_id) <where> t.del_flg = '0' <if test="loginId != null and loginId != ''"> and (t.login_id LIKE CONCAT('%',#{loginId},'%') or t1.user_name LIKE CONCAT('%',#{loginId},'%')) </if> <if test="deptId != null and deptId != ''"> and ( t1.dept_id = #{deptId} or t3.ANCESTORS like CONCAT(#{deptId},',%') or t3.ANCESTORS like CONCAT('%,',#{deptId},',%') or t3.ANCESTORS like CONCAT('%,',#{deptId})) </if> <if test="mobilePhone != null and mobilePhone != ''"> and t1.mobile_phone LIKE CONCAT('%',#{mobilePhone},'%') </if> <if test="userStatus != null and userStatus != ''"> and t.user_status = #{userStatus} </if> <if test="startDate != null and endDate != null"> and t.create_time >= #{startDate} </if> <if test="endDate != null"> and t.create_time <= #{endDate} </if> </where> order by t.create_time desc 帮我优化一下这段sql
这段 SQL 查询语句已经很好了,但是可以根据实际情况进行优化,下面是一些可能的优化建议:
1. 添加索引:可以为 `sys_user` 表的 `login_id` 和 `del_flg` 列以及 `sys_user_info` 表的 `dept_id` 和 `mobile_phone` 列添加索引,这有助于提高查询性能。
2. 使用 EXISTS 替代 LEFT JOIN:可以使用 EXISTS 子查询替代 LEFT JOIN 子查询,因为 EXISTS 子查询只需要判断是否存在满足条件的记录即可,而不需要返回所有匹配的记录集合,这样可以提高查询效率。
3. WHERE 子句中的条件顺序:将常量条件放在 WHERE 子句的前面,变量条件放在后面,这样可以优化查询执行计划。
4. 去掉不必要的括号:可以去掉 WHERE 子句中的一些不必要的小括号,这样可以使 SQL 语句更简洁明了。
下面是优化后的 SQL 查询语句:
```
SELECT t.id AS userId, t1.user_name AS userName, t.create_time AS createTime, t1.login_id AS loginId, t1.mobile_phone AS mobilePhone, t.user_status AS userStatus, t1.mailbox AS mailbox, t1.dept_id AS deptId, t3.dept_name AS deptName
FROM sys_user t
LEFT JOIN sys_user_info t1 ON t1.login_id = t.login_id
LEFT JOIN sys_dept t3 ON t1.dept_id = t3.dept_id
WHERE t.del_flg = '0'
AND t.login_id LIKE CONCAT('%', #{loginId}, '%') OR t1.user_name LIKE CONCAT('%', #{loginId}, '%')
AND t1.dept_id = #{deptId} OR EXISTS (SELECT 1 FROM sys_dept d WHERE d.dept_id = #{deptId} AND t3.ANCESTORS LIKE CONCAT(d.ANCESTORS, '%'))
AND t1.mobile_phone LIKE CONCAT('%', #{mobilePhone}, '%')
AND t.user_status = #{userStatus}
AND t.create_time >= #{startDate}
AND t.create_time <= #{endDate}
ORDER BY t.create_time DESC
```
注意:上述 SQL 查询语句仅供参考,具体优化建议需要根据实际情况进行调整。
<select id="getVOlist" resultType="com.huike.clues.domain.vo.BusinessChangeVO"> select b.create_by as createBy, count(b.id) as num,d.dept_name as deptName from tb_business b,sys_user u,sys_dept d where b.create_by = u.user_name and u.dept_id = d.dept_id <if test="beginCreateTime != null and beginCreateTime != ''"><!-- 开始创建时间 --> and b.create_time BETWEEN #{beginCreateTime} AND #{endCreateTime} </if> order by num DESC limit 10 </select>
这似乎是一个 MyBatis 的 XML 配置文件中定义的 SQL 查询语句,用于从数据库中获取业务变更记录的视图对象列表。其中,该查询语句会根据业务变更记录的创建人、创建时间和所属部门信息进行关联查询,并按照业务变更记录数目的降序排列,最后只返回前 10 条记录。在 SQL 查询语句中还使用了一个条件判断语句,用于根据指定的开始创建时间和结束创建时间限制查询结果的时间范围。
阅读全文