SQL 相同结构的多张表,如何联合查询符合条件的记录数?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL 相同结构的多张表,如何联合查询符合条件的记录数?相关的知识,希望对你有一定的参考价值。

首先月销售记录的表结构是相同的,现在想查询的是在全年的周一这天,24个时段内的订单数量。

表:11月订单表
订单编号 创建时间
001 2014-11-01 10:00:00
002 2014-11-01 11:00:00
003 2014-11-01 12:00:00

表:12月订单表
订单编号 创建时间
001 2014-12-01 10:00:00
002 2014-12-01 11:00:00
003 2014-12-01 12:00:00

现在我能做到的是查询单张表格的数据:
select CONCAT(extract(hour from 创建时间),'-',extract(hour from 创建时间)+1)时段,DAYNAME(订单创建时间)周几, count(*)计数 FROM `12月订单表` where DAYNAME(创建时间)="monday" GROUP BY extract(hour from 创建时间);
通过上面的SQL语句就能查询当月所有周一的各个时段的订单数量了。

但是如果 from `12月订单表`,`11月订单表`这样子联合的话,用 `12月订单表`.创建时间 来指定表名的话,查询时间爆长,而且出来的数字也是错误的。

求大神指点!!

可以使用union关键字

select CONCAT(extract(hour from 创建时间),'-',extract(hour from 创建时间)+1)时段,DAYNAME(订单创建时间)周几, count(*)计数 FROM `12月订单表` where DAYNAME(创建时间)="monday" GROUP BY extract(hour from 创建时间)
union
select CONCAT(extract(hour from 创建时间),'-',extract(hour from 创建时间)+1)时段,DAYNAME(订单创建时间)周几, count(*)计数 FROM `11月订单表` where DAYNAME(创建时间)="monday" GROUP BY extract(hour from 创建时间)

参考技术A select CONCAT(extract(hour from 创建时间),'-',extract(hour from 创建时间)+1)时段,DAYNAME(订单创建时间)周几, count(*)计数 FROM [11月订单表] where DAYNAME(创建时间)="monday" GROUP BY extract(hour from 创建时间)
union
select CONCAT(extract(hour from 创建时间),'-',extract(hour from 创建时间)+1)时段,DAYNAME(订单创建时间)周几, count(*)计数 FROM [12月订单表] where DAYNAME(创建时间)="monday" GROUP BY extract(hour from 创建时间);

追问

这样查询还得自己一个时段一个时段累加,1年12张表呢,所以才想找个办法直接查询所有记录在周一的24个时段的记录数。不过还是谢谢你~

追答

我不太明白你的意思,你能把你想要的结果弄个模板出来吗?

追问

最终的结果是:
时间段 订单数
10-11 2
11-12 2
12-13 2

也就是说,全年在10-11点这两个时间段里,共创建了2个订单,11-12点之间全年创建了2个订单,以此类推。

本回答被提问者和网友采纳
参考技术B 搞不懂你为什么要把11月,12月 JOIN 联合起来查询, 没有实际意义, 如果想查询两个月的,直接用union all 就可以了追问

union all 试过了,结果是11月的0-1,1-2,2-3时间段,然后紧跟着12月的0-1,1-2,2-3时间段,最后还是得自己每个月累加

追答

当时应该把所有数据放在一个表中,然后增加字段是月份的,由于月份被表划分开来了,所以只有一张张表去单独查询。这也是没有办法的事情

追问

因为这些表格是EXCEL文档导入到mysql里面的,是外部数据这样收集的。那看起来只能用最麻烦的创建一张临时表,然后把其他12张表格里的几个关键数据先导入到其中,再运行上面我列出来的语句~谢谢你的回答!

SQL多个表联合查询优化的问题

请问 我有一个表和4个子表 要联合查询。放在一个GRID里面 一般查询是
select 成绩表.ID,姓名表.学生姓名,班级表.班级名,成绩表.语文,成绩表.数学,教师表.老师姓名 from
(1) 成绩表,姓名表,班级表,教师表 where 成绩表.学生ID =姓名表.学生ID and 成绩表.班级ID=班级表.ID and 成绩表.教师ID=教师表.ID
(2) 成绩表 left join 姓名表 on 成绩表.学生ID =姓名表.学生ID left join 班级表 on 成绩表.班级ID=班级表.ID left join 教师表 on 成绩表.教师ID=教师表.ID
有这2种方法来查数据我的本意是做数据库分页 而且由于条件比较多 所以我选择了视图在处理方式。从上面的代码来看(2)的效率会比(1)高。可是视图要是有索引则不允许有left join 方式。
所以有点2难。是放弃视图索引 还是选择(1)方法。如果选择了索引那 (1)和(2)的查询速度差别很大吗。。在记录数比较庞大的时候。。。
这样做好视图我就可以直接在存储过程采用分页方法来实现海量数据的快速查询了。。

参考技术A 你为何不考虑存储过程呢。如果你的数据是一些不怎么改变的你就用视图这样效率高。追问

本身设计就是分页的存储过程 存储过程里面 要查询如上的表 但是表结构复杂 所以就打算用视图先做 然后在存储过程里面直接用这个视图进行条件筛选 。。。

追答

就这样做吧,效率不索引高的。

以上是关于SQL 相同结构的多张表,如何联合查询符合条件的记录数?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle数据库-多表联合查询&子查询

sql mysql多表如何关联查询

两张dbf格式的表格,我要用SQL语句查询数据,要怎么弄。

mysql中union与union all的区别

SQL多张表如何合并成一张报表?

多表查询