MySQL union 和 order by 同时使用

目录
  • 一、出现错误的情况
  • 二、解决上述问题的两种方法
  • 三、案例分析:
    • 求解:
    • 常见的错误解法
      • (1)使用 union 和 多个order by 不加括号 【报错】
      • (2)order by 在 union 子句中不起作用
    • 正确解法
      • (1)order by 在 union 连接的子句的子句中使用
      • (2)先使用 union 后使用order by

一、出现错误的情况

(1)使用 union 和 多个order by 不加括号 报错

(2)order by 在 union 连接的子句不起作用

二、解决上述问题的两种方法

(1)order by 在 union 连接的子句的子句中使用

(2)先使用 union 后使用order by

三、案例分析:

我们举个例子进行说明,案例来自:SQL132 每个题目和每份试卷被作答的人数和次数

描述

现有试卷作答记录表exam_record(uid用户ID, exam_id试卷ID, start_time开始作答时间, submit_time交卷时间, score得分):

id uid exam_id start_time submit_time score
1 1001 9001 2021-09-01 09:01:01 2021-09-01 09:41:01 81
2 1002 9002 2021-09-01 12:01:01 2021-09-01 12:31:01 70
3 1002 9001 2021-09-01 19:01:01 2021-09-01 19:40:01 80
4 1002 9002 2021-09-01 12:01:01 2021-09-01 12:31:01 70
5 1004 9001 2021-09-01 19:01:01 2021-09-01 19:40:01 85
6 1002 9002 2021-09-01 12:01:01 (NULL) (NULL)

题目练习表practice_record(uid用户ID, question_id题目ID, submit_time提交时间, score得分):

id uid question_id submit_time score
1 1001 8001 2021-08-02 11:41:01 60
2 1002 8001 2021-09-02 19:30:01 50
3 1002 8001 2021-09-02 19:20:01 70
4 1002 8002 2021-09-02 19:38:01 70
5 1003 8001 2021-08-02 19:38:01 70
6 1003 8001 2021-08-02 19:48:01 90
7 1003 8002 2021-08-01 19:38:01 80

请统计每个题目和每份试卷被作答的人数和次数,分别按照"试卷"和"题目"的uv & pv降序显示,示例数据结果输出如下:

tid uv pv
9001 3 3
9002 1 3
8001 3 5
8002 2 2

解释:“试卷”有3人共练习3次试卷9001,1人作答3次9002;“刷题”有3人刷5次8001,有2人刷2次8002。

求解:

分析思路

难点:

1.union 和 order by 同时使用需要注意的问题

(1)统计每份试卷被作答的人数和次数

  • [条件]:where score >= 85 and year(start_time) = 2021

  • [使用]:distinct。一定要去重

(2)统计每个题目被作答的人数和次数

  • [条件]:where difficulty = 'hard' and score > 80 and year(start_time) = 2021 and timestampdiff(minute, start_time, submit_time) < duration / 2

  • [使用]:多表连接使用 join using( )

(3)合并两个表,分别按照"试卷"和"题目"的uv & pv降序显示

  • [使用]:union all 和union 都可以,因为列activity不会有重复。

最终结果

select * from 
(
select 查询结果 [试卷ID; 作答次数]
from 从哪张表中查询数据[试卷作答记录表]
group by 分组条件 [试卷ID]
order by 对查询结果排序 [按照"试卷"的uv & pv降序]
)
union
select * from 
(
select 查询结果 [题目ID; 作答次数]
from 从哪张表中查询数据[题目练习表]
group by 分组条件 [题目ID]
order by 对查询结果排序 [按照"题目"的uv & pv降序]
)

常见的错误解法

(1)使用 union 和 多个order by 不加括号 【报错】

select 
    exam_id as tid,
    count(distinct uid) as uv,
    count(uid) as pv
from exam_record a
group by exam_id
order by uv desc, pv desc
union
select 
    question_id as tid,
    count(distinct uid) as uv,
    count(uid) as pv
from practice_record b
group by question_id
order by uv desc, pv desc

执行出错

程序异常退出, 请检查代码"是否有数组越界等异常"或者"是否有语法错误"

SQL_ERROR_INFO: "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'union all\n\nselect \n question_id as tid,\n count(distinct uid) as uv,\n co' at line 11"

这是因为union在没有括号的情况下只能有一个order by。为什么只能有一个order by 呢?

既然不加括号出错,那我就加上括号使用2个order by !

(2)order by 在 union 子句中不起作用

(select 
    exam_id as tid,
    count(distinct uid) as uv,
    count(uid) as pv
from exam_record a
group by exam_id
order by uv desc, pv desc)
union
(select 
    question_id as tid,
    count(distinct uid) as uv,
    count(uid) as pv
from practice_record b
group by question_id
order by uv desc, pv desc)

结果发现这样写order by在每个子表中不起作用!所以这种方法也不对。但是 union 可以在子句的子句中起作用,写成下面这样:

正确解法

方法一:

(1)order by 在 union 连接的子句的子句中使用

#正确代码
select * from 
(
select 
    exam_id as tid,
    count(distinct uid) as uv,
    count(uid) as pv
from exam_record a
group by exam_id
order by uv desc, pv desc
) a
union
select * from 
(
select 
    question_id as tid,
    count(distinct uid) as uv,
    count(uid) as pv
from practice_record b
group by question_id
order by uv desc, pv desc
) attr

那我是不是可以union两个子句之后再使用order by ,但是这个排序要对2个表分别进行降序,就需要写成下面这样:

方法二:

(2)先使用 union 后使用order by

使用函数

left(str,length) 函数: str左边开始的长度为 length 的子字符串,在本例中为‘9’和‘8’

解释:试卷编号以‘9’开头、题目编号以‘8’开头,对编号进行降序就是对"试卷"和"题目"分别进行排序

(
#每份试卷被作答的人数和次数
select
    exam_id as tid,
    count(distinct uid) as uv,
    count(*) as pv
from exam_record
group by exam_id
)
union
(
#每个题目被作答的人数和次数
select
    question_id as tid,
    count(distinct uid) as uv,
    count(*) as pv
from practice_record
group by question_id
)
#分别按照"试卷"和"题目"的uv & pv降序显示
order by left(tid,1) desc,uv desc,pv desc

推荐使用方法一,更具有普适性。

本文转载于网络 如有侵权请联系删除

相关文章

  • ceph 将cephFS导出成NFS使用实例

    image.pngimage.pngimage.pngimage.pngimage.pngimage.png在window上挂载CephFSimage.pngimage.pngimage.pngimage.pngimage.png

  • GJK算法计算凸多边形之间的距离

    缘起《你被追尾了续》中我们学习了GJK碰撞检测算法.但其实GJK算法发明出来的初衷是计算凸多边形之间的距离的.所以我们来学习一下这种算法.分析根据《你被追尾了续》的学习,我们知道,其实就是求坐标原点到Minkowski和(也是一个凸多边形)的距离.以下图为例,显然shape1(三角形)和shape2(四边形)没有交集,然后我们想计算它俩之前的距离做出它俩的Minkowski和如下所以答案就是OD的长度.所以我们自然要解决的问题是,怎么快速能知道答案是坐标原点到(-4,1)到(1,3)的线段的距离呢?和GJK碰撞检测类似的,我们不能O(n^2)暴力枚举Minkowski和的所有的点,这里也是使用迭代.其实和GJK碰撞检测完全类似,我们也需要用supprt函数迭代的构建单纯形,伪代码如下d=c2-c1;//和GJK碰撞检测类似 Simplex.add(support(shape1,shape2,d));//Simplex中加入a点 Simplex.add(support(shape1,shape2,-d));//Simplex中加入b点 //从原点指向ab线段上距离原点最近的点的向量,例如

  • 004 C# 将Word表格数据批量写入Excel

    Hi,Howareyoudoing? 我是职场编码,很高兴为你分享经验心得。距离上次发文,已有一个月时间;这一个月,我一直在考虑继续研究C#,还是拥抱Python;学编程自然是为了辅助工作,达到高效办公目的;据我所知,非专业人士玩编程,顶多实现重复工作自动化;即套用固定格式模板,实现数据填入汇总自动化,只是每月数据不同罢了;像一键生成10w+,自动绘制爆款海报等这类黑科技,并不是我们所能涉足的领域;对比C#和Python,一静一动,一编译一解释;除此之外,前者使用{}区分代码块,而Python使用缩进区分;现在Python火的一塌糊涂,竞争也异常激烈;经过综合分析考虑,我不想随大流,我选择继续研究C#;不论你是学习哪种编程语言,真心希望这篇文章能给你带来实际帮助。001安装IDE编辑器与VisualStudio2013相比,我今天推荐的这款IDE性价比更高;SharpDevelop这个轻型的开发工具专门用于C#编程开发;不过可惜的是,它的最新版本是2015年7月4日发布的;据粉丝反映,不少公司电脑配置很低,无法快速运行VisualStudio;我们掌握它,用于实现重复工作自动化已经足够

  • 基于腾讯云TKE的大规模强化学习实践

    |导语大规模的强化学习需要海量的异构计算资源,批量快速启停训练任务,高频更新模型参数,跨机跨进程共享模型数据等。传统的手工管理模式操作繁琐,面临诸多不确定性,带来的各种挑战无法支撑大规模强化学习的场景。本文介绍了腾讯内部某业务基于TKE构建大规模强化学习解决方案,以及与传统手工模式对比该方案带来的优势。一、项目挑战大规模的强化学习需要海量的异构计算资源,批量快速启停训练任务,高频更新模型参数,跨机跨进程共享模型数据等。在传统的手工管理模式下,大规模的强化学习面临诸多问题:1.经费预算受限单次全量实验需要多达数万个CPU核心和数百个GPU卡。单次全量实验持续一周到两周。连续两次全量实验间隔从几天到几周不定。从整体上看资源使用率很低,实验间隔期资源浪费,经费有限,无法支撑长期持有如此大规模数量的物理机机器资源。2.大规模机器的管理复杂性手动管理和运维几千台机器(折合几万核心),包括IP,账号、密码,GPU驱动安装,训练环境管理等,复杂性和难度极高。代码更新后,发布困难,一致性难以保证。随着训练规模的进一步增大,管理复杂的问题更加突出。3.效率问题分布式训练代码架构,要求快速批量启停数万规模

  • 小程序目录结构

            第一篇微信小程序的博文,不知从何开始说;name就从最基础的目录结构来说吧,初次接触这个东西自己也是折腾挺久的,这里系统的对比一下web开发的文件结构对比! 使用微信开发工具创建demo你会发现有个文件        app.js,app.json,app.wxml和app.wxss四个文件,js和json相对于有一定前端基础的伙伴比较熟悉,但是后两种就是感觉不认识了. app.js说明 app.js是规定小程序全局的js脚本文件复制    app.json说明 app.json规定了小程序全局的配置复制app.wxss规定了小程序全局的样式,相当于web开发的css文件复制上述的文件名前缀都是app开头,这样的文件规定了这是设置整个小程序的必要文件        还有一个page的目录,这里存放页面的文件,在page目录下创建每个单独的页面文件夹,page目录相当于所有页面的管理目录,在这个page目录创建每个页面的目录,在page下创建index(首页),about(关于页面)等页面         在index文件夹下创建index.wxml,index.wxss

  • 从零开始 Spark 性能调优

    0、背景集群部分spark任务执行很慢,且经常出错,参数改来改去怎么都无法优化其性能和解决频繁随机报错的问题。看了下任务的历史运行情况,平均时间3h左右,而且极其不稳定,偶尔还会报错:1、优化思路任务的运行时间跟什么有关?(1)数据源大小差异在有限的计算下,job的运行时长和数据量大小正相关,在本例中,数据量大小基本稳定,可以排除是日志量级波动导致的问题:(2)代码本身逻辑缺陷比如代码里重复创建、初始化变量、环境、RDD资源等,随意持久化数据等,大量使用shuffle算子等,比如reduceByKey、join等算子。在这份100行的代码里,一共有3次shuffle操作,任务被sparkdriver切分成了4个stage串行执行,代码位置如下:咱们需要做的就是从算法和业务角度尽可能减少shuffle和stage,提升并行计算性能,这块是个大的话题,本次不展开详述。(3)参数设置不合理这块技巧相对通用,咱们来看看之前的核心参数设置:num-executors=10||20,executor-cores=1||2,executor-memory=10||20,driver-memory=2

  • DeepMind说机器推理水平能超人类,现在有人把代码搞出来了

    问耕发自凹非寺 量子位报道|公众号QbitAI这事儿有点快。前天,DeepMind发布两篇新论文,探讨了深度神经网络利用非结构化数据进行复杂关系推理的能力。(报道传送门)在第一篇论文,DeepMind证明神经网络在简单关系推理中,表现超过人类。在第二篇论文中,神经网络可基于视觉观察来预测实体对象的未来状态。这边DeepMind论文刚发,就有人放出了代码实现,比官方速度还快。基于DeepMind的第一篇论文,用户kimhc6028在GitHub上发布了一个PyTorch实现。而且这个实现表现还不错。作者表示他的代码在关系推理上的精确度达到70%。测试基于3轮Epoch之后。(训练还在进行中……)作者实现和测试的,是一个称作Sort-of-CLEVR的任务。Sort-of-CLEVR是CLEVR的简化版本。DeepMind在论文中表示,基于标准视觉问答架构,CLEVR取得的最佳成绩是正确率68.5%,而人类的成绩为92.5%。然而,通过由RN增强的网络,DeepMind取得了超人的水平:95.5%。kimhc6028放出的PyTorch实现要求如下:Python2.7numpypytorc

  • 开发 | 我做了12万条的影评分析,告诉你《战狼Ⅱ》都在说些啥

    本文原作者麦艳涛。本文原载于知乎专栏。截止到8月15日,《战狼Ⅱ》上映的第19天,票房已超45亿人民币。真正成为唯一一部挺进世界影史票房前100名的亚洲电影。抛开爆炸的票房不说,电影还激起了观众各种情绪,甚至有人放狠话说:敢喷《战狼Ⅱ》的,要么是智障,要么是公敌,就是这么简单粗暴。尽管各路评论出街,媒体闹得沸沸扬扬,观众还是傻傻分不清楚哪边意见比较靠谱。本文通过Python爬虫的方式获取数据,对豆瓣电影评论进行分析,制作了豆瓣影评的云图。现在,让我们来看看,《战狼Ⅱ》评论里到底藏着哪些有趣的潜台词。数据的获取对于数据的获取,本文采用的是Python爬虫的方式获取的数据。用到的主要是requests包与正则包re。该程序并未对验证码进行处理。之前也爬取过豆瓣的网页,当时由于爬取的内容少,所以并没有遇到验证码的事情。在写本文爬虫的时候,原以为也不会有验证码,但是当爬取到大概15000个评论的时候跳出来验证码。然后我就想不就是十二万吗?最多我也就是输入大概十几次验证码,所以就没有处理验证码的事情。但是接下来的事情就有点坑到我了。爬取15000左右评论并输入验证码的时候,我以为会接下来爬取到3

  • 查看Maven版本_maven部署

    大家好,又见面了,我是你们的朋友全栈君一、下载压缩包官方地址:Maven–DownloadApacheMaven​maven.apache.org直接使用wget命令进行下载maven压缩包 >wgethttps://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz二、解压tar-zxvfapache-maven-3.6.3-bin.tar.gz三、配置环境变量vi/etc/profile在底部新增MAVEN_HOME安装目录参数exportMAVEN_HOME=/usr/local/apache-maven-3.6.3exportPATH=MAVEN_HOME/bin:PATH(PS:MAVEN_HOME此处小伙伴填写自己实际安装目录即可)四、刷新环境变量-使配置生效source/etc/profile五、大功告成使用mvn-version命令查看安装maven版本信息发布者:全栈程序员栈长,转载请注明出处:https://javafor

  • 顺序表应用7:最大子段和之分治递归法

    顺序表应用7:最大子段和之分治递归法 描述  给定n(1<=n<=50000)个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的副本。当所给的整体互换负数时定义子段和为0,依此定义,所求的最优变量:Max{0,a[i]+a[i+1]+...+a[j]},1<=i<=j<=n。例如,当(a[1],a[2],a[3],a[4],a[5],a[6])=(-2,11,-4,13,-5,-2)时,最大子段和为20。   注意:本次修订要求用分治递归归法替代,除了需要输出最大子段和的值之外,还需要输出求得该结果所需的递归调用总次数。   递归归零总次数的获得,可以参考以下求菲波那切数列的代码段中变量变量的用法: #includeintcount=0;intmain(){  intn,m;  intfib(intn);  scanf(“%d”,&n);  m=fib(n);&nbs

  • OpenCV-Python教程:查找轮廓、绘制轮廓

    原文链接:http://www.juzicode.com/opencv-python-findcontours-drawcontours 返回Opencv-Python教程 图像轮廓用来描述图像中连续的点,它们有同样的颜色和灰度级。为了更精确地进行检测,在查找轮廓前需要先将图像做二值化处理或者使用canny边沿检测。在OpenCV中轮廓检测只查找白色目标,黑色背景会被忽略。 1、查找轮廓findContours() contours,hierarchy=cv2.findContours(image,mode,method[,contours[,hierarchy[,offset]]])复制 参数含义:image:输入图像,8bit单通道;图像元素的值为0表示背景,非0值表示前景,为了精确查找轮廓,最好对原始图像做二值化处理。如果mode参数为RETR_CCOMP或RETR_FLOODFILL输入图像也可以是32bit单通道图像(CV_32SC1)。但是floodfill不支持cv-8u类型mode:轮廓提取模式。method:轮廓近似方法。contours:找到的轮廓。hierarch

  • Redis主从复制的配置和实现原理

    原文:https://juejin.cn/post/6844903943764443149 Redis的持久化功能在一定程度上保证了数据的安全性,即便是服务器宕机的情况下,也可以保证数据的丢失非常少。通常,为了避免服务的单点故障,会把数据复制到多个副本放在不同的服务器上,且这些拥有数据副本的服务器可以用于处理客户端的读请求,扩展整体的性能 下面会介绍Redis的主从复制配置和实现原理,后续还会有Redis的高可用方案:哨兵机制(Sentinel)、分区集群(Cluster) 什么是主从复制 我们可以通过slaveof<host><port>命令,或者通过配置slaveof选项,来使当前的服务器(slave)复制指定服务器(master)的内容,被复制的服务器称为主服务器(master),对主服务器进行复制操作的为从服务器(slave) 主服务器master可以进行读写操作,当主服务器的数据发生变化,master会发出命令流来保持对salve的更新,而从服务器slave通常是只读的(可以通过slave-read-only指定),在主从复制模式下,即便maste

  • 【html】【11】函数名称约束规范

    一、匈牙利命名法:[不推荐]基本原则是:变量名=属性+类型+对象描述,其中每一对象的名称都要求有明确含义,可以取对象名字全称或名字的一部分。要基于容易记忆容易理解的原则。保证名字的连贯性是非常重要的。 举例来说,表单的名称为form,那么在命名法中可以简写为frm,则当表单变量名称为Switchboard时,变量全称应该为frmSwitchboard。这样可以很容易从变量名看出Switchboard是一个表单,同样,如果此变量类型为标签,那么就应命名成lblSwitchboard。 匈牙利命名法中常用的小写字母的前缀:前 缀             类  型a                     数组(Array)  b&nbs

  • 大放异彩的伪元素——可以做什么?(转)别人分享的文章,发现很不错,果断收藏了

    伪元素:before和:after可以做的东西是相当惊人的。对于页面上的每一个元素,你拥有了两个更灵活的、而且可以完成其它HTML元素都能完成的东西的元素。它们让一大堆有趣的设计成为可能,而且不会对你的语义标签产生负面影响。这里有一大堆关于这些有趣的效果的示例,你想看的话就接着往下看吧。 多重背景画布   因为你可以将伪元素相对于它们的父类元素绝对定位,你可以想象成每个元素都有两个额外的层。NicolasGallagher向我们展示了它的很多种应用,包括多边界、模拟CSS3多重背景、等高栏等。 增加单个元素能创建的形状数目   这上面所有的形状都可以只用一个元素创建,而且更加实用。相对于那些使用1700个div元素来“用纯CSS做一个咖啡杯”的事情,很整齐,但不实用。 这是一个六角星的示例: CSS #star-six{ width:0; height:0; border-left:50pxsolidtransparent; border-right:50pxsolidtransparent; border-bottom:100pxsolidred; posi

  • 一篇文章搞定组件通信

    常用的组件通信方式:6种 props 适用于的场景:父子组件通信 注意事项: 如果父组件给子组件传递数据(函数):本质就是子组件给父组件传递数据 如果父组件给子组件传递数据(数据):本质就是父组件给子组件传递数据 书写方式:3种小提示:路由的props 例如:['todo'],{type:Array},{type:Array,default:[]} 书写方式:布尔值,对象,函数形式 自定义事件   适用于的场景:子给父传递数据 使用方式:$on与$emit 全局事件总线 适用于场景:万能 使用方式:Vue.prototype.$bus=this 消息订阅与发布(pubsub) 适用于场景:万能 React框架中使用比较多  Vuex 适用于场景:万能 插槽 适用于场景:父子组件通信----(传递的一般是结构) 分类:默认插槽、具名插槽、作用域插槽 v-model 实现原理:value与input事件实现的,而且还需要注意可以通过v-model实现父子组件数据同步 sync属性修饰符 实现原理: :money.sync,代表父组

  • HashMap中哈希表的长度为什么需要是2的幂次方以及怎么实现

    看过HashMap源码的人可能都用印象,就是hashMap的哈希表长度可以由自己指定也可以不指定使用默认长度,但是如果在了解或者发现tableSizeFor方法的话,你就会知道此方法会改变我们的输入长度(如果我们输入15,他会改为16),那么他为什么要修改我们设置的长度,以及修改后有什么作用?带着这个疑问我们往下看; 1.HashMap的长度为什么需要是2的幂次方 为了能让hashMap存取高效,尽量减少碰撞,也就是要尽量把数据分配均匀。 Hash值的取值范围-2147483648到2147483647,总共有40+亿个映射空间,只要哈希函数映射的比较均匀,一般应用很难出现碰撞,但是内存肯定不能一次加载这么长的数组,所以这个散列值是不能拿来直接用的,我们只能创建合理长度的数组作为哈希表,在插入数据之前做取模运算,得到的余数就是将要存放的数据在哈希表中对应的下标。在HashMap中这个下标的取值算法是:(n-1)&hashn是哈希表的长度。 取模运算中如果除数是2的幂次方则等价于其与除数减一的&操作,就是:hash%length==hash&(length-1

  • python中遇到的问题集合

    问题一:如何将python2的代码一键转化为ptython3 解决情况: 1、在D:\Python37-32\Scripts,在该python的安装环境下,查看是否存在2to3这个自带的py文件 2、若在的情况下,直接在pycharm中的terminal中直接运行2to3.-w 就会直接将所有该目录下的py文件转化一遍   2to3./filename.py 表示转化特定的某个文件   转化后会出现一个bak文件,该文件就是原来python2的文件。你可以直接将其移至其他地方即可。     3、若该目录下,不存在2to3的py文件,说明你还没有安装该库。需要使用pip先安装该库:   pipinstall2to3   下载完成再去查看该目录会显示该文件,然后按照步骤2操作即可  

  • 小白学习Spark系列一:Spark简介

      由于最近在工作中刚接触到scala和Spark,并且作为python中毒者,爬行过程很是艰难,所以这一系列分为几个部分记录下学习《Spark快速大数据分析》的知识点以及自己在工程中遇到的小问题,以下阶段也是我循序了解Spark的一个历程。   先抛出几个问题: 什么是Spark? Spark内部是怎么实现集群调度的? 如何调用Spark? 如何打包一个Spark独立应用? 一、Spark是什么   Spark是一个用来实现快速而通用的集群计算平台。它一个主要特点是能够在内存中进行计算,并且提供了基于Python、Java、Scala和SQL的API,可以和其他大数据工具配合使用。由于Spark的核心引擎有着速度快和通用的特点,因此它还支持各种不同应用场景专门设计的高级组件,比如SQL和机器学习等。组件其实可以理解为Spark针对常见的任务场景而封装好的模块,这些模块提供了各场景的基本功能。组件之间可以相互调用,各组件如图1-1: 图1-1Spark软件栈  SparkCore实现了任务调度、内存管理、错误恢复、与存储系统交互等模块,并且还包含了对弹性分布式数据集(

  • CSS3的nth-child() 选择器,表格奇偶行变色

    nth-child()应用背景 CSS3的nth-child()选择器,我之前很少用,在做表格偶数行变色的时候,我通常在绑定的时候,做一个js判断,来加一个css,从而使表格偶数行和奇数行颜色不一样。这样的兼容性很好。但是最近在做手机网站的时候,由于手机网站对浏览器兼容要求相对较低,手机浏览器大部分都支持css3,这就大大提高了开发效率。可以随意使用CSS3:nth-child()伪类选择器。 nth-child()浏览器支持 IE9及以上版本,火狐,谷歌,Safari,Opera都支持! 定义和用法 :nth-child(n)选择器匹配属于其父元素的第n个子元素,不论元素的类型。 n可以是数字、关键词或公式。 例如: p:nth-child(2) { background:#ff0000; } <body> <h1>这是标题</h1> <p>haorooms第一个段落。</p> <p>haorooms第二个段落。</p> <p>haorooms第三个段落。</p> &l

  • 「题解」蝙蝠侠的麻烦

    没事找事 「我的做题历程」: step1:观察题面。   「蝙蝠侠需要找到一个最长的字符串,使得这个字符串作为一个子序列被包含在所有的三个字符串中」,可以得出这是一道最长公共子序列,而且有三个字符串。(题型:线性dp——最长公共子序列)   「蝙蝠侠现在需要找到的是最大的长度,而不是序列」,说明只是一道普通的LCS。 step2:思考解法。   第一步思考dp状态: \(dp_{i,j,k}\):第一串前\(i\)项,第二串前\(j\)项,第三串前\(k\)项中的最长公共子序列长度。   对于当前的\(a_{i},b_{j},c_{k}\)而言,只有能做贡献或无法做贡献两种状态。   若\(a_{i}=b_{j}=c_{k}\),则它们能做贡献,此时的最长公共子序列的长度为第一串前\(i-1\)项,第二串前\(j-1\)项,第三串前\(k-1\)项中的最长公共子序列的长度加\(1\)。   否则它们无法做贡献,此时放弃做贡献最小的那一项。   第二步思考状态转移方程:   本题比常规的LCS要多一个字符串,因此只需要再多一维就好。 \[dp_{i,j,k}=dp_{i-1,j-

  • Mock测试

    原文地址:https://blog.csdn.net/qq_44614026/article/details/124355704 Mock测试Mock测试Mock测试的作用Mock测试的优点Mock测试的缺点Mock客户端测试Python中的Mock库Mock服务端Mock测试Mock就是在测试过程中,对于一些不容易构造/获取的对象,创建一个Mock对象来模拟对象的行为 Mock方法是单元测试中常见的一种技术,它的主要作用是模拟一些在应用中不容易构造或者比较复杂的对象,从而把测试与测试边界以外的对象隔离开。 Mock测试的作用在单元测试过程中,数据可能需要经过多方获取,且流程复杂   ClassA要从ClassB和ClassC中获取数据,而ClassC中该数据又来源于ClassD和ClassE 这时可以利用Mock去构造虚拟的ClassB和ClassC对象用于ClassA的测试,因为我们只是想测试classA的行为是否符合预期,并不需要去测试依赖对象 Mock功能可以根据接口/数据结构定义、Mock规则配置、Mock期望配置,自动生成模拟数据,且使用者可以根据需要灵活构造各种

相关推荐

推荐阅读