SQL_STUDY:3.WHERE

本文详细讲解了SQL语句中的WHERE子句及其在MyBatis框架中的应用和转换方法,包括条件筛选、运算符使用及XML格式特殊字符的转义技巧。

摘要

  1. where 与mybatis 直接的转换

SQL WHERE 子句

WHERE 子句

如需有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句。

语法

SELECT 列名称 FROM 表名称 WHERE 列 运算符 值

下面的运算符可在 WHERE 子句中使用:

操作符描述mybatis
=等于=
<>不等于
>大于&gt;
<小于&lt;
>=大于等于&gt;=
<=小于等于&lt;=
BETWEEN在某个范围内
LIKE搜索某种模式
&&amp;

mybatis 转义
因为这个是xml格式的,所以不允许出现类似“>”这样的字符,但是都可以使用<![CDATA[ ]]>符号进行说明,将此类符号不进行解析
你的可以写成这个:
<![CDATA[ when min(starttime)<='12:00' and max(endtime)<='12:00' ]]>
注释:在某些版本的 SQL 中,操作符 <> 可以写为 !=。


我知道sql中各个关键字的含义,请帮我梳理下列sql想要表达的修改逻辑 UPDATE i_tigermed_po_study_unitbase_progress SET cumulative_unit_count = ( SELECT COALESCE(SUM(COALESCE(actual_cnt, forecast_cnt)), 0) FROM ( SELECT t2.data_month, MAX(CASE WHEN t2.data_type = &#39;actual&#39; AND (i_tigermed_po_study_unitbase_progress.data_type = &#39;forecast&#39; OR t2.data_month <![CDATA[<=]]> i_tigermed_po_study_unitbase_progress.data_month) THEN t2.period_unit_count END) AS actual_cnt, MAX(CASE WHEN t2.data_type = &#39;forecast&#39; THEN t2.period_unit_count END) AS forecast_cnt FROM i_tigermed_po_study_unitbase_progress t2 INNER JOIN ( SELECT t31.data_month, t31.data_type, MAX(t31.view_month) AS max_view_month FROM i_tigermed_po_study_unitbase_progress t31 WHERE t31.study_unitbase_id = i_tigermed_po_study_unitbase_progress.study_unitbase_id AND t31.unitbase_task_id = i_tigermed_po_study_unitbase_progress.unitbase_task_id AND t31.view_month <![CDATA[<=]]> i_tigermed_po_study_unitbase_progress.view_month AND t31.is_deleted = &#39;0&#39; GROUP BY t31.data_month, t31.data_type ) t3 ON t2.data_month = t3.data_month AND t2.data_type = t3.data_type AND t2.view_month = t3.max_view_month WHERE t2.study_unitbase_id = i_tigermed_po_study_unitbase_progress.study_unitbase_id AND t2.unitbase_task_id = i_tigermed_po_study_unitbase_progress.unitbase_task_id AND (t2.data_type = i_tigermed_po_study_unitbase_progress.data_type OR i_tigermed_po_study_unitbase_progress.data_type = &#39;forecast&#39;) AND t2.data_month <![CDATA[<=]]> i_tigermed_po_study_unitbase_progress.data_month AND t2.is_deleted = &#39;0&#39; GROUP BY t2.data_month ) tt ) WHERE study_unitbase_id = #{studyUnitbaseId}::INT8 AND view_mon
03-29
解释下面修改sql的含义 UPDATE i_tigermed_po_study_unitbase_progress SET cumulative_unit_count = ( SELECT COALESCE(SUM(COALESCE(actual_cnt, forecast_cnt)), 0) FROM ( SELECT t2.data_month, MAX(CASE WHEN t2.data_type = &#39;actual&#39; AND (i_tigermed_po_study_unitbase_progress.data_type = &#39;forecast&#39; OR t2.data_month <![CDATA[<=]]> i_tigermed_po_study_unitbase_progress.data_month) THEN t2.period_unit_count END) AS actual_cnt, MAX(CASE WHEN t2.data_type = &#39;forecast&#39; THEN t2.period_unit_count END) AS forecast_cnt FROM i_tigermed_po_study_unitbase_progress t2 INNER JOIN ( SELECT t31.data_month, t31.data_type, MAX(t31.view_month) AS max_view_month FROM i_tigermed_po_study_unitbase_progress t31 WHERE t31.study_unitbase_id = i_tigermed_po_study_unitbase_progress.study_unitbase_id AND t31.unitbase_task_id = i_tigermed_po_study_unitbase_progress.unitbase_task_id AND t31.view_month <![CDATA[<=]]> i_tigermed_po_study_unitbase_progress.view_month AND t31.is_deleted = &#39;0&#39; GROUP BY t31.data_month, t31.data_type ) t3 ON t2.data_month = t3.data_month AND t2.data_type = t3.data_type AND t2.view_month = t3.max_view_month WHERE t2.study_unitbase_id = i_tigermed_po_study_unitbase_progress.study_unitbase_id AND t2.unitbase_task_id = i_tigermed_po_study_unitbase_progress.unitbase_task_id AND (t2.data_type = i_tigermed_po_study_unitbase_progress.data_type OR i_tigermed_po_study_unitbase_progress.data_type = &#39;forecast&#39;) AND t2.data_month <![CDATA[<=]]> i_tigermed_po_study_unitbase_progress.data_month AND t2.is_deleted = &#39;0&#39; GROUP BY t2.data_month ) tt ) WHERE study_unitbase_id = #{studyUnitbaseId}::INT8 AND view_month = #{viewMonth}::VARC
03-29
WITH tb_psh AS ( WITH -- 用户当天学过哪些项目(通过点击记录判断) project_study_clicks AS ( SELECT DISTINCT user_id, project_id, TO_CHAR(create_time, &#39;YYYY-MM-DD&#39;) AS study_date FROM zsh_project_object_click_record WHERE user_id = #{param.userId} ), -- 项目任务总数(加 project_complete_type 条件) project_total_tasks AS ( SELECT zpo.project_id, CASE WHEN zpcs.project_complete_type = 1 THEN COUNT(zpo.id) ELSE SUM(CASE WHEN zpo.required = 1 THEN 1 ELSE 0 END) END AS total_count FROM zsh_project_object zpo LEFT JOIN zsh_project_common_setting zpcs ON zpo.project_id = zpcs.project_id WHERE zpo.object_type < 990 GROUP BY zpo.project_id, zpcs.project_complete_type ), -- 某日之前已完成的任务数 project_finished_tasks_by_day AS ( SELECT dates.project_id, dates.study_date, CASE WHEN zpcs.project_complete_type = 1 THEN SUM(CASE WHEN zpsr.finish = 1 THEN 1 ELSE 0 END) ELSE SUM(CASE WHEN zpo.required = 1 AND zpsr.finish = 1 THEN 1 ELSE 0 END) END AS finished_count FROM project_study_clicks dates LEFT JOIN zsh_project_object zpo ON dates.project_id = zpo.project_id LEFT JOIN zsh_project_common_setting zpcs ON dates.project_id = zpcs.project_id LEFT JOIN zsh_project_study_record zpsr ON dates.project_id = zpsr.project_id AND zpsr.user_id = dates.user_id AND zpsr.finish = 1 AND zpsr.object_id = zpo.object_id AND zpsr.update_time <= dates.study_date::timestamp + INTERVAL &#39;1 day&#39; - INTERVAL &#39;1 second&#39; GROUP BY dates.project_id, dates.study_date, zpcs.project_complete_type ), -- 项目学习时长(仅课件) project_study_time_by_day AS ( SELECT zpo.project_id, TO_CHAR(zstr.create_time, &#39;YYYY-MM-DD&#39;) AS study_date, SUM(zstr.spent_time) / 60 AS spent_time FROM zsh_project_object zpo -- 展开课程下课件 LEFT JOIN zsh_course_object zco ON zpo.object_type = 1 AND zpo.object_id = zco.course_id -- 关联课件学习记录 JOIN zsh_study_time_record zstr ON ( (zpo.object_type = 20 AND zstr.object_id = zpo.object_id) OR (zpo.object_type = 10 AND zstr.object_id = zco.object_id) ) LEFT JOIN zsh_project_common_setting zpcs ON zpo.project_id = zpcs.project_id WHERE zstr.object_type = 2 AND zstr.user_id = #{param.userId} GROUP BY zpo.project_id, TO_CHAR(zstr.create_time, &#39;YYYY-MM-DD&#39;) ) -- 项目历史记录 SELECT psc.project_id AS object_id, 3 AS object_type, zp.name AS object_name, psc.study_date, zp.cover, COALESCE(pst.spent_time, 0) AS spent_time, zp.cover, CASE WHEN ptt.total_count = 0 THEN 0 ELSE ROUND(COALESCE(pft.finished_count, 0) * 100 / ptt.total_count) END AS progress FROM project_study_clicks psc JOIN zsh_project zp ON zp.id = psc.project_id LEFT JOIN project_total_tasks ptt ON ptt.project_id = psc.project_id LEFT JOIN project_finished_tasks_by_day pft ON pft.project_id = psc.project_id AND pft.study_date = psc.study_date LEFT JOIN project_study_time_by_day pst ON pst.project_id = psc.project_id AND pst.study_date = psc.study_date ) SELECT * FROM tb_psh ORDER BY study_date DESC 有能够优化的地方吗,这样写会不会导致查询效率很慢
07-18
WITH consecutive_sessions AS ( -- First, get all study sessions with row numbers to identify consecutive sessions SELECT ss.student_id, ss.subject, ss.session_date, ss.hours_studied, ROW_NUMBER() OVER (PARTITION BY ss.student_id ORDER BY ss.session_date) as session_order FROM study_sessions ss ), session_groups AS ( -- Group consecutive sessions by checking date gaps SELECT cs1.*, -- Check if there&#39;s a gap > 2 days from previous session CASE WHEN LAG(session_date) OVER (PARTITION BY student_id ORDER BY session_date) IS NULL THEN 1 WHEN DATEDIFF(session_date, LAG(session_date) OVER (PARTITION BY student_id ORDER BY session_date)) <= 2 THEN 0 ELSE 1 END as is_new_group FROM consecutive_sessions cs1 ), grouped_sessions AS ( -- Create group numbers for consecutive session sequences SELECT *, SUM(is_new_group) OVER (PARTITION BY student_id ORDER BY session_date) as group_id FROM session_groups ), pattern_analysis AS ( -- For each group of consecutive sessions, analyze the pattern SELECT student_id, group_id, COUNT(DISTINCT subject) as unique_subjects, COUNT(*) as total_sessions, SUM(hours_studied) as total_hours, -- Create the subject sequence string to check for repeating patterns GROUP_CONCAT(subject ORDER BY session_date SEPARATOR &#39;|&#39;) as subject_sequence FROM grouped_sessions GROUP BY student_id, group_id HAVING COUNT(*) >= 6 -- At least 6 sessions for 2 complete cycles of 3 subjects AND COUNT(DISTINCT subject) >= 3 -- At least 3 different subjects ), valid_patterns AS ( -- Check if the pattern actually repeats for at least 2 complete cycles SELECT student_id, group_id, unique_subjects as cycle_length, total_sessions, total_hours, subject_sequence, -- Check if we have at least 2 complete cycles CASE WHEN total_sessions >= (unique_subjects * 2) THEN 1 ELSE 0 END as has_complete_cycles FROM pattern_analysis ), cycle_validation AS ( -- Validate that the pattern actually repeats correctly SELECT gs.student_id, gs.group_id, vp.cycle_length, vp.total_hours, -- Check if the subject sequence repeats correctly COUNT(*) as session_count, -- Get the first cycle pattern GROUP_CONCAT( CASE WHEN gs.session_order <= vp.cycle_length THEN gs.subject ELSE NULL END ORDER BY gs.session_date SEPARATOR &#39;|&#39; ) as first_cycle, -- Check if subsequent sessions follow the same pattern COUNT(CASE WHEN gs.session_order > vp.cycle_length AND gs.subject = ( SELECT subject FROM grouped_sessions gs2 WHERE gs2.student_id = gs.student_id AND gs2.group_id = gs.group_id AND gs2.session_order = ((gs.session_order - 1) % vp.cycle_length) + 1 ) THEN 1 ELSE NULL END) as matching_pattern_count FROM grouped_sessions gs JOIN valid_patterns vp ON gs.student_id = vp.student_id AND gs.group_id = vp.group_id WHERE vp.has_complete_cycles = 1 GROUP BY gs.student_id, gs.group_id, vp.cycle_length, vp.total_hours HAVING session_count >= (cycle_length * 2) AND matching_pattern_count = (session_count - cycle_length) -- All sessions after first cycle match pattern ) -- Final result with student information SELECT s.student_id, s.student_name, s.major, cv.cycle_length, cv.total_hours as total_study_hours FROM cycle_validation cv JOIN students s ON cv.student_id = s.student_id ORDER BY cv.cycle_length DESC, cv.total_hours DESC
最新发布
11-21
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值