最近遇到一个需求,需要将数据库的一条记录展示成4条记录。初次一听,什么玩意??仔细分析之后,大概是这样,一条记录有多个字段,这些字段又可以归为不同类别,所以需要展示成多行形式。
这里想到2种方案,1是将记录从数据库中原模原样取出来,在代码中将记录分成多条记录;2是使用union,选择记录中的部分字段,合并记录中的另一部分字段,接下来分析第二种方法。
1:建一张测试表 user
插入几条数据:
2:使用union 将每条记录显示成 2条记录,
前端展示成 : 水果,1,苹果,小苹果
野味,2,山楂,小山楂
水果,1,橘子,小橘子
野味,2,杨桃,小杨桃
sql语句:select name,id,apple,appleName from user union select name,id,orange,orangeName from user
执行结果:
分析:如果单独执行 select name,id,apple,appleName from user,只会得到2条记录,使用union后将 select name,id,orange,orangeName from user (2条)的记过合并 ,并且去重。合并,去重表现在结果的总记录行数。 上述结果已经可以证明union 有进行合并(4条),如何证明有去重呢?
2.1.证明union存在去重功能
这里需要改变user表的数据,不然没法证明。
sql:select name,id,apple,appleName from user union select name,id,orange,orangeName from user
执行结果:
分析:结果变成了3条,select name,id,apple,appleName from user 的结果有2条, select name,id,orange,orangeName from user 也有2条,但是 4条结果中有2条是重复的记录:水果,1,苹果,小苹果。最终去掉一条,剩下3条。如果想要不去重记录,使用 union all 连接结果。
3.union使用的注意事项
3.1.union 的结果记录 名称是 以第一条sql(使用union)的结果命名的。
3.2 使用union的sql 返回的列数必须一致,且必需与第一条sql的列数一致
sql:select name,id,apple from user union select name,id,orange,orangeName from user
第一条sql 返回 3 个字段,第二条sql返回4个字段
执行结果
3.3 使用union的sql 返回字段类型可以不用一致
将表结构变成:
sql:select name,id,apple,appleName from user union select name,id,orange,orangeName from user
执行结果:
3.4 使用union 可以构造 数据
添加一列 type 数据
sql:select name,id,apple,appleName, 1 type from user union select name,id,orange,orangeName, 2 from user
执行结果: