-
mysql sql语句 两张表查询(a最新记录时间 查询b最新值)25
总体描述:根据交易记录表中的交易记录,得到汇率表中该交易记录时间后的第一条最新汇率
交易记录表 (sale_log):
主键 币种 兑换金额 交易时间 交易日期
1 USD 100 10:08:23 2010-05-15
2 EUR 50 10:10:01 2010-05-15
3 USD 10 20:21:19 2010-05-15
4 USD 100 22:01:06 2010-05-15
5 USD 20 01:23:46 2010-05-16
6 EUR 10 12:07:06 2010-05-16
币种汇率表(rate):同一币种一天可能存在多个汇率,需要精确到秒
币种 录入时间 汇率值
USD 2010-05-15 08:00:05 6.8315
USD 2010-05-15 20:10:05 6.8310
EUR 2010-05-15 08:00:05 10.1261
USD 2010-05-16 08:00:05 6.8286
EUR 2010-05-16 08:10:55 10.1207
USD 2010-05-16 22:07:00 6.7789
EUR 2010-05-16 18:20:35 10.1211
需要的结果是:以记录表为准,得到每条记录的汇率(得到 >= 每条记录产生的时间 的第一条汇率)
表展现为:
主键 币种 兑换金额 交易时间 交易日期 记录后最新汇率
1 USD 100 10:08:23 2010-05-15 6.8310
2 EUR 50 10:10:01 2010-05-15 10.1207
3 USD 10 20:21:19 2010-05-15 6.8286
4 USD 100 22:01:06 2010-05-15 6.8286
5 USD 20 01:23:46 2010-05-16 6.8286
6 EUR 10 12:07:06 2010-05-16 10.1211
问题补充:missoasis 写道交易时间,交易日期 ,录入时间 字段类型是什么?什么数据库?oracle?
交易时间---varchar
交易日期---date
录入时间---datetime
mysql数据库
问题补充:missoasis 写道我自己建的表,测试完全正确
你好,可以把你建表的SQL语句+ 运行的SQL语句发给我吗? 谢谢了
问题补充:missoasis 写道没问题记得给分,有问题再说
#
# Table structure for table a
#
DROP TABLE IF EXISTS `a`;
CREATE TABLE `a` (
`id` int(11) NOT NULL,
`bizhong` varchar(255) default NULL,
`duihuan` int(11) default NULL,
`shijian` varchar(255) NOT NULL,
`riqi` date NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
#
# Dumping data for table a
#
/*!40101 SET NAMES gbk */;
INSERT INTO `a` VALUES (1,'1',100,'10:49:32','2010-05-14');
INSERT INTO `a` VALUES (2,'2',50,'11:55:19','2010-05-14');
INSERT INTO `a` VALUES (3,'2',100,'15:33:18','2010-05-15');
INSERT INTO `a` VALUES (4,'3',100,'20:12:09','2010-05-15');
DROP TABLE IF EXISTS `b`;
CREATE TABLE `b` (
`id` int(11) NOT NULL auto_increment,
`bizhong2` varchar(30) default NULL,
`lurushijian` datetime NOT NULL,
`huilv` double(12,2) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=gbk;
#
# Dumping data for table b
#
/*!40101 SET NAMES gbk */;
INSERT INTO `b` VALUES (1,'1','2010-05-14 10:49:31',7.68);
INSERT INTO `b` VALUES (2,'2','2010-05-14 10:49:33',11.56);
INSERT INTO `b` VALUES (3,'1','2010-05-14 12:49:31',7.66);
INSERT INTO `b` VALUES (4,'1','2010-05-14 22:49:31',7.61);
INSERT INTO `b` VALUES (5,'2','2010-05-15 08:01:00',11.32);
INSERT INTO `b` VALUES (6,'3','2010-05-15 21:01:01',123);
INSERT INTO `b` VALUES (7,'2','2010-05-15 21:01:00',11.07);
INSERT INTO `b` VALUES (8,'2','2010-05-14 20:00:07',11.44);
这是我的数据,测试时发现币种1的结果是取的正确的,但是币种2的汇率应该取 (2,'2','2010-05-14 10:49:33',11.56);这条数据,却取的是15号的数据了,希望楼主能再帮忙看下,就差一点点了,再次谢谢了
问题补充:INSERT INTO `b` VALUES (2,'2','2010-05-14 10:49:33',11.56);
11.56插入的时间是在交易后,而且是交易后的时间第一个,应该取这个数据,而不应该取
INSERT INTO `b` VALUES (8,'2','2010-05-14 20:00:07',11.44);
这两个数据都是交易后的汇率,而且11.56比这条早
问题补充:missoasis 写道引用你交易时间是10:49:33,也就是说你插入在未交易前就插入了11.56这条数据说错了,你插入b的时间是10:49:33
之前的数据测试是对的,但是我后来调试的时候,把
INSERT INTO `a` VALUES (2,'2',50,'11:55:19','2010-05-14');
改为
INSERT INTO `a` VALUES (2,'2',50,'09:55:19','2010-05-14');
后,这条记录的汇率应该取'09:55:19'后的汇率对吧,也就是
INSERT INTO `b` VALUES (2,'2','2010-05-14 10:49:33',11.56);
但是还是取的
INSERT INTO `b` VALUES (8,'2','2010-05-14 20:00:07',11.44);
问题补充:missoasis 写道不好意思,有点麻烦了,又嵌套一层行了
select x.id , x.bizhong, x.duihuan, x.shijian, x.riqi, x.huilv from(select a.*,b.id as id2,b.bizhong2,b.huilv,b.lurushijian ,(replace(replace(replace(b.lurushijian,'-',''),':',''),' ','')-replace(replace(concat(a.riqi,a.shijian),'-',''),':','')) as cha
FROM
a
inner join b ON a.bizhong=b.bizhong2
where (replace(replace(replace(b.lurushijian,'-',''),':',''),' ','')-replace(replace(concat(a.riqi,a.shijian),'-',''),':',''))>0
order by a.id) x inner join (select id as id3 ,min(cha) as cha3 from(select a.*,b.id as id2,b.bizhong2,b.huilv,b.lurushijian ,(replace(replace(replace(b.lurushijian,'-',''),':',''),' ','')-replace(replace(concat(a.riqi,a.shijian),'-',''),':','')) as cha
FROM
a
left join b ON a.bizhong=b.bizhong2
where (replace(replace(replace(b.lurushijian,'-',''),':',''),' ','')-replace(replace(concat(a.riqi,a.shijian),'-',''),':',''))>0
order by a.id) c group by id) y on x.id=y.id3 and x.cha=y.cha3
天哪,我已经简化数据库表了,刚才的交易表已经是虚拟出来的中间表了(涉及3张表的查询),
如果拼SQL语句的话,再加上这。。。,真的没有其他办法了吗?
我已经被这问题困扰三天了,再整不出我估计要疯了
问题补充:missoasis 写道引用天哪,我已经简化数据库表了,刚才的交易表已经是虚拟出来的中间表了(涉及3张表的查询),
如果拼SQL语句的话,再加上这。。。,真的没有其他办法了吗?
我已经被这问题困扰三天了,再整不出我估计要疯了
要么写存数过程,要么程序里控制,一般不会直接这样处理的
做的是报表,17种币种,不能程序控制,要不访问数据库次数会成倍增加,存储过程不能用,只能自己拼接SQL
555555555555555555555555
问题补充:missoasis 写道干嘛不给三张表,给两张表不一定就方便,老自己查自己多麻烦
QQ 53440881
现在方便的话我们在QQ中聊好吗
问题补充:xiaohuxiaoyu 写道不是只有两张表得吗,怎么又多出一张
另外张表是币种转换表,跟交易记录没关系,只起翻译币种,所以我就没列2010年5月19日 09:13
16个答案 按时间排序 按投票排序
-
采纳的答案
不好意思,有点麻烦了,又嵌套一层行了
select x.id , x.bizhong, x.duihuan, x.shijian, x.riqi, x.huilv from(select a.*,b.id as id2,b.bizhong2,b.huilv,b.lurushijian ,(replace(replace(replace(b.lurushijian,'-',''),':',''),' ','')-replace(replace(concat(a.riqi,a.shijian),'-',''),':','')) as cha
FROM
a
inner join b ON a.bizhong=b.bizhong2
where (replace(replace(replace(b.lurushijian,'-',''),':',''),' ','')-replace(replace(concat(a.riqi,a.shijian),'-',''),':',''))>0
order by a.id) x inner join (select id as id3 ,min(cha) as cha3 from(select a.*,b.id as id2,b.bizhong2,b.huilv,b.lurushijian ,(replace(replace(replace(b.lurushijian,'-',''),':',''),' ','')-replace(replace(concat(a.riqi,a.shijian),'-',''),':','')) as cha
FROM
a
left join b ON a.bizhong=b.bizhong2
where (replace(replace(replace(b.lurushijian,'-',''),':',''),' ','')-replace(replace(concat(a.riqi,a.shijian),'-',''),':',''))>0
order by a.id) c group by id) y on x.id=y.id3 and x.cha=y.cha32010年5月19日 15:52
-
select * ,(select 汇率值 from rate r where r.币种=s.币种 order by 汇率值 desc limit(0, 1)) from sale_log s;
2013年3月11日 17:27
-
引用天哪,我已经简化数据库表了,刚才的交易表已经是虚拟出来的中间表了(涉及3张表的查询),
如果拼SQL语句的话,再加上这。。。,真的没有其他办法了吗?
我已经被这问题困扰三天了,再整不出我估计要疯了
要么写存数过程,要么程序里控制,一般不会直接这样处理的2010年5月19日 16:01
-
CREATE TABLE `rate` (
`bz` varchar(20) NOT NULL,
`lrsj` datetime NOT NULL,
`hlz` float NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
CREATE TABLE `sale_log` (
`id` int(5) NOT NULL auto_increment,
`jysj` time default NULL,
`bz` varchar(20) default NULL,
`je` float default NULL,
`jyrq` date default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
你试一下:
SELECT s.bz,s.jysj,s.jyrq,s.je,r.hlz FROM rate r,(SELECT bz,jysj,jyrq,CONCAT(jyrq,' ',jysj) s_jytime,je FROM sale_log) s
WHERE s.s_jytime>(SELECT MAX(r.lrsj) lrsj FROM rate r,(SELECT bz,jysj,jyrq,CONCAT(jyrq,' ',jysj) s_jytime,je FROM sale_log) s
WHERE s.s_jytime>r.lrsj) AND r.bz=s.bz;2010年5月19日 15:34
-
引用11.56插入的时间是在交易后,而且是交易后的时间第一个,应该取这个数据,而不应该取
INSERT INTO `b` VALUES (8,'2','2010-05-14 20:00:07',11.44);
这两个数据都是交易后的汇率,而且11.56比这条早
我靠,你币种为2的这条数据交易时间是11:55:19,如下:引用INSERT INTO `a` VALUES (2,'2',50,'11:55:19','2010-05-14');
你交易时间是10:49:33,也就是说你插入在未交易前就插入了11.56这条数据2010年5月19日 15:04
-
select *, max(h.dt) from (select id,rate.Currency,exchange, date,time, value,datetime as dt from rate right join sale_log on rate.currency=sale_log.currency and concat(date,' ',time) <rate.`DateTime`) as h group by id
我这个可以,至少我能得到你需要的结果,不过选出来的列较多,你需要自己剔出一下。2010年5月19日 14:53
-
引用INSERT INTO `b` VALUES (2,'2','2010-05-14 10:49:33',11.56);引用INSERT INTO `b` VALUES (8,'2','2010-05-14 20:00:07',11.44);引用INSERT INTO `a` VALUES (2,'2',50,'11:55:19','2010-05-14');
我运行取得时11.44这条数据,不是15号的,另外交易后的数据,明显不能是11.56这条数据,这条数据在交易前插入的,难道我发错了语句?
select id ,bizhong,duihuan,shijian,riqi,huilv,min(cha) from(select a.*,b.id as id2,b.bizhong2,b.huilv,b.lurushijian ,(replace(replace(replace(b.lurushijian,'-',''),':',''),' ','')-replace(replace(concat(a.riqi,a.shijian),'-',''),':','')) as cha
FROM
a
left join b ON a.bizhong=b.bizhong2
where (replace(replace(replace(b.lurushijian,'-',''),':',''),' ','')-replace(replace(concat(a.riqi,a.shijian),'-',''),':',''))>0
order by a.id) c group by id
2010年5月19日 14:37
-
CREATE TABLE `a` (
`id` int(11) NOT NULL,
`bizhong` varchar(255) default NULL,
`duihuan` double default NULL,
`shijian` varchar(255) NOT NULL,
`riqi` date NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
相当于你的交易记录表
CREATE TABLE `b` (
`id` int(11) NOT NULL auto_increment,
`bizhong2` varchar(30) default NULL,
`lurushijian` datetime NOT NULL,
`huilv` double NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=gbk;
相当于你的币种汇率表
数据是你的数据,执行的是下面的语句
select id ,bizhong,duihuan,shijian,riqi,huilv,min(cha) from(select a.*,b.id as
id2,b.bizhong2,b.huilv,b.lurushijian ,(replace(replace(replace
(b.lurushijian,'-',''),':',''),' ','')-replace(replace(concat
(a.riqi,a.shijian),'-',''),':','')) as cha
FROM
a a
left join b b ON a.bizhong=b.bizhong2
where (replace(replace(replace(b.lurushijian,'-',''),':',''),' ','')-replace(replace
(concat(a.riqi,a.shijian),'-',''),':',''))>0
order by a.id) c group by id2010年5月19日 13:35
-
看看下面这个,找个你的表的字段改改
select id ,bizhong,duihuan,shijian,riqi,huilv,min(cha) from(select a.*,b.id as
id2,b.bizhong2,b.huilv,b.lurushijian ,(replace(replace(replace
(b.lurushijian,'-',''),':',''),' ','')-replace(replace(concat
(a.riqi,a.shijian),'-',''),':','')) as cha
FROM
sale_log a
left join rate b ON a.bizhong=b.bizhong2
where (replace(replace(replace(b.lurushijian,'-',''),':',''),' ','')-replace(replace
(concat(a.riqi,a.shijian),'-',''),':',''))>0
order by a.id) c group by id2010年5月19日 12:50
相关推荐
本资源提供了两张MySQL数据库表格,分别涉及会计科目和会计科目分类,这对于构建会计信息系统或进行财务数据分析是非常有价值的。 首先,我们来看`subject.sql`文件,这应该是存储会计科目的SQL脚本。在SQL中,创建...
sql 查出一张表中重复的所有记录数据 1.表中有id和name 两个字段,查询出name重复的所有数据 select * from xi a where (a.username) in (select username from xi group by username having count(*) > 1) 2、...
标题中的"一条sql语句关联八个表"涉及到的就是这种复杂的联接查询。这种查询通常用于从分布在不同表中的相关数据中提取所需信息。下面我们将深入探讨这个主题。 首先,我们了解SQL的基本联接类型: 1. **INNER ...
MySQL常用SQL语句解析 MySQL是一种关系型数据库管理系统,广泛应用于Web应用程序的开发中。掌握MySQL的常用SQL语句是开发者的必备技能。本文将对常用的MySQL SQL语句进行详细的解析。 1. 查看数据库命令:show ...
### MySQL数据库SQL语句增删改查笔记 #### 一、插入数据(Insert) 在MySQL中,`INSERT INTO`语句用于向表中插入新记录。语法格式为: ```sql INSERT INTO 表名 (列1, 列2, ..., 列n) VALUES (值1, 值2, ..., 值n...
查询数据是指从数据库中的数据表或视图中获取所需要的数据,在mysql中,可以使用SELECT语句来查询数据。根据查询条件的不同,数据库系统会找到不同的数据。 SELECT语句的基本语法格式如下: [sql] view plain copy ...
"mysql 一条语句删除多表" 的主题就是关于如何通过单个SQL语句来删除关联的多个表的数据,从而节省数据库连接资源和提高执行效率。下面将详细解释这一技术及其背后的原理。 首先,我们要理解的是SQL语言中的“JOIN...
### SQL语句练习知识点解析 #### 一、创建数据库与数据表 1. **创建数据库:** - **SQL语句:** `CREATE DATABASE student;` - **知识点解析:** 这条命令用于创建一个新的数据库`student`。在创建数据库时,...
- 与方法一类似,这里也是通过`WHERE`子句来匹配两张表中的记录。 - 不同之处在于,这里使用了一个子查询来获取目标列的值。 2. **应用场景**: - 当两张表的结构不完全相同,或者需要同步的数据来自于更复杂的...
总结,通过上述SQL语句,我们可以有效地在MySQL中获取特定时间段内的数据。在实际应用中,这些技巧对于数据分析、报表生成以及基于时间的查询非常有用。理解并熟练运用这些函数和操作,将极大地提升数据库管理的效率...
在同一张`article`表中,将`A`字段的值复制到`B`字段。 2. 批量复制列数据: ```sql UPDATE tb_1 SET content_target = content_source; ``` 这将`tb_1`表的`content_source`列数据复制到`content_target`列...
这个SQL语句首先指定了两个表A和B,然后使用SET语句来更新A表中的c1和c2字段,这两个字段的值分别设置为B表中对应的c1和c2字段的值。WHERE子句用来指定更新条件,即只有当A表的id与B表的id相等并且B表的age大于50时...
子查询首先找到与表`table_a`中每个标题匹配的`table_b`中的最大`addDate`值,然后将这些值与`table_a`中的数据进行连接。 ### 4. 左外连接 #### SQL语句: ```sql SELECT a.a, a.b, a.c, b.c, b.d, b.f FROM ...
在MySQL数据库管理中,复制表结构和内容是...同时,对SQL语句的优化也是提高数据库性能的关键,比如合理选择索引、避免全表扫描、减少数据类型转换等。在实际操作中,要结合业务需求和数据库特性,灵活运用这些技巧。
这将显示两张表中相等的部门号所有字段。也可以使用以下查询语句来查询员工表中的部门号,并且条件是员工表中部门号与部门表中部门号相等: ```sql select tb_e.deptno from tb_e, tb_d where tb_e.deptno=tb_d....
Oracle、SQL Server 及 MySQL 的查询语句执行顺序相同:开始->FROM 子句->WHERE 子句->GROUP BY 子句->HAVING 子句->ORDER BY 子句->SELECT 子句->LIMIT 子句。每个子句执行后都会产生一个中间结果,供接下来的子句...
根据提供的文件内容,我们可以整理出一系列有关MySQL的基本操作知识点,主要涵盖了数据定义语言(DDL)、数据操纵语言(DML)、数据查询语言(DQL)以及一些高级查询技巧。接下来,我们将详细阐述这些知识点。 ### ...
本文主要总结了在MySQL中进行多表更新的不同SQL语句写法,适用于需要根据一张表中的数据来更新另一张表的情况。 首先,我们可以使用传统的`UPDATE`语句与两张表的简单联接(JOIN)来实现跨表更新。例如,假设有`...
### 21天学会SQL语句——SQL21自学通 #### 第一部分:SQL基础知识概述 **SQL**(Structured Query Language)是一种用于管理和处理数据库的标准计算机语言。它被广泛应用于各种数据库系统中,如MySQL、Oracle、SQL...
如果有两张表`students`和`courses`,分别代表学生和课程信息,并且通过`student_id`关联。为了获取每个学生及其所选课程的列表,可以使用`INNER JOIN`: ```sql SELECT students.name, courses.course_name FROM ...