zoukankan      html  css  js  c++  java
  • sql查询结果本身要被使用两次

    一、问题

      查询用户所有的错题数目到前端展示,要求展示的时候要有错题的编号,从1开始递增。如果删除了第5题,则将后面的题编号均向前挪。

    二、分析

      错题是在用户每次做题过程中插入到错题表中的,或者将题目推送表中“错题标识字段”置1,我们没有必要在表中维护一个编号位,因为该编号位除了展示并无其他用途,如果在表中维护的话肯定会造成很多问题。

      使用with as将查询的信息内容查询出并暂存,在后面的查询中会多次用到。

      参考了一些文章,说with as可以将其下标明的信息进行暂存,然后在该sql中的其他位置作为结果集进行引用,这样只进行一次查询。

    with b as(    
    SELECT ( SELECT D .CONTENT_HTML         FROM MIC_PAPER_PROBLEMS D      WHERE D .tm_id = pm.tm_id ) questionTitle, 
           ( SELECT P .ANSWER_HTML         FROM MIC_PAPER_PROBLEMS P      WHERE P .TM_ID = pm.tm_id ) rightAns,
            pm. ID pushId,
            PM.tm_id questionId, 
            PM.USER_ANSWER yourAnswer        
    FROM MIC_TD_EXERCISE_PUSH_PROBLEM pm, MIC_TD_EXERCISE_USER_PUSH ph    
    WHERE pm.push_id = ph. ID AND ph.USER_ID = ? AND ph.SUBJECT_ID = ?    and PM.IS_CORRECT = 2 
    order by PH.PUSH_TIME,PM.CREATE_TIME 
    )
    select rownum seq, b.* 
    from b
    where b.pushId in (select min(b.pushId) from b  group by b.QUESTIONID)

    这样在oracle将as中的内容查询出来之后,命名为b,然后执行最下面的select查询,其中where条件中的无关子查询是为了保证用户对同一道题的错题只显示一个(比如,题目a,用户答了两次,都答错了,题目表中会记录两条数据,此处只将该题目展示一次即可)。

  • 相关阅读:
    206. 反转链表
    JAVA 排序总结
    Codeforces Round #674 (Div. 3)
    【BM模板】
    【 lca 】最近公共祖先
    【 欧拉函数 】GCD
    【 裴蜀定理 】Border
    【调和级数 && 欧拉常数】 Harmonic Number
    【Lucas定理】组合数取模算法
    【 最短路 && 思维 】Escape Plan
  • 原文地址:https://www.cnblogs.com/brolanda/p/4524020.html
Copyright © 2011-2022 走看看