0 0

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
  • 大小: 14.3 KB
  • 大小: 17.1 KB
  • 大小: 21.5 KB

16个答案 按时间排序 按投票排序

0 0

采纳的答案

不好意思,有点麻烦了,又嵌套一层行了
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

2010年5月19日 15:52
0 0

select * ,(select 汇率值 from rate r where r.币种=s.币种 order by 汇率值 desc limit(0, 1)) from sale_log s;

2013年3月11日 17:27
0 0

不是只有两张表得吗,怎么又多出一张

2010年5月19日 16:17
0 0

干嘛不给三张表,给两张表不一定就方便,老自己查自己多麻烦

2010年5月19日 16:06
0 0

引用
天哪,我已经简化数据库表了,刚才的交易表已经是虚拟出来的中间表了(涉及3张表的查询),
如果拼SQL语句的话,再加上这。。。,真的没有其他办法了吗?
我已经被这问题困扰三天了,再整不出我估计要疯了

要么写存数过程,要么程序里控制,一般不会直接这样处理的

2010年5月19日 16:01
0 0

用我的数据自己测试一下,我只测试了一个

2010年5月19日 15:36
0 0

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
0 0

引用
你交易时间是10:49:33,也就是说你插入在未交易前就插入了11.56这条数据
说错了,你插入b的时间是10:49:33

2010年5月19日 15:05
0 0

引用
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
0 0

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
0 0

引用
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
0 0

没问题记得给分,有问题再说

2010年5月19日 13:37
0 0

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 id

2010年5月19日 13:35
0 0

我自己建的表,测试完全正确

2010年5月19日 12:57
0 0

看看下面这个,找个你的表的字段改改

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 id

2010年5月19日 12:50
0 0

交易时间,交易日期 ,录入时间 字段类型是什么?什么数据库?oracle?

2010年5月19日 09:33

相关推荐

    会计科目和会计科目分类的两张mysql表,sql语句文件

    本资源提供了两张MySQL数据库表格,分别涉及会计科目和会计科目分类,这对于构建会计信息系统或进行财务数据分析是非常有价值的。 首先,我们来看`subject.sql`文件,这应该是存储会计科目的SQL脚本。在SQL中,创建...

    MySQL根据某一个或者多个字段查找重复数据的sql语句

    sql 查出一张表中重复的所有记录数据 1.表中有id和name 两个字段,查询出name重复的所有数据 select * from xi a where (a.username) in (select username from xi group by username having count(*) &gt; 1) 2、...

    一条sql语句关联八个表

    标题中的"一条sql语句关联八个表"涉及到的就是这种复杂的联接查询。这种查询通常用于从分布在不同表中的相关数据中提取所需信息。下面我们将深入探讨这个主题。 首先,我们了解SQL的基本联接类型: 1. **INNER ...

    MySQL常用sql语句(本人整理而出)

    MySQL常用SQL语句解析 MySQL是一种关系型数据库管理系统,广泛应用于Web应用程序的开发中。掌握MySQL的常用SQL语句是开发者的必备技能。本文将对常用的MySQL SQL语句进行详细的解析。 1. 查看数据库命令:show ...

    MySQL数据库sql语句增删改查笔记

    ### MySQL数据库SQL语句增删改查笔记 #### 一、插入数据(Insert) 在MySQL中,`INSERT INTO`语句用于向表中插入新记录。语法格式为: ```sql INSERT INTO 表名 (列1, 列2, ..., 列n) VALUES (值1, 值2, ..., 值n...

    MySql基本查询、连接查询、子查询、正则表达查询讲解

    查询数据是指从数据库中的数据表或视图中获取所需要的数据,在mysql中,可以使用SELECT语句来查询数据。根据查询条件的不同,数据库系统会找到不同的数据。 SELECT语句的基本语法格式如下: [sql] view plain copy ...

    mysql 一条语句删除多表数据

    "mysql 一条语句删除多表" 的主题就是关于如何通过单个SQL语句来删除关联的多个表的数据,从而节省数据库连接资源和提高执行效率。下面将详细解释这一技术及其背后的原理。 首先,我们要理解的是SQL语言中的“JOIN...

    SQL语句练习--数据库

    ### SQL语句练习知识点解析 #### 一、创建数据库与数据表 1. **创建数据库:** - **SQL语句:** `CREATE DATABASE student;` - **知识点解析:** 这条命令用于创建一个新的数据库`student`。在创建数据库时,...

    Mysql数据库+多表之间的数据同步SQL语句+多字段排序语句

    - 与方法一类似,这里也是通过`WHERE`子句来匹配两张表中的记录。 - 不同之处在于,这里使用了一个子查询来获取目标列的值。 2. **应用场景**: - 当两张表的结构不完全相同,或者需要同步的数据来自于更复杂的...

    mysql中获取一天、一周、一月时间数据的各种sql语句写法

    总结,通过上述SQL语句,我们可以有效地在MySQL中获取特定时间段内的数据。在实际应用中,这些技巧对于数据分析、报表生成以及基于时间的查询非常有用。理解并熟练运用这些函数和操作,将极大地提升数据库管理的效率...

    mysql把一个表某个字段的内容复制到另一张表的某个字段的SQL语句写法

    在同一张`article`表中,将`A`字段的值复制到`B`字段。 2. 批量复制列数据: ```sql UPDATE tb_1 SET content_target = content_source; ``` 这将`tb_1`表的`content_source`列数据复制到`content_target`列...

    mysql面试题

    这个SQL语句首先指定了两个表A和B,然后使用SET语句来更新A表中的c1和c2字段,这两个字段的值分别设置为B表中对应的c1和c2字段的值。WHERE子句用来指定更新条件,即只有当A表的id与B表的id相等并且B表的age大于50时...

    常用mysql语句实例

    子查询首先找到与表`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语句

    在MySQL数据库管理中,复制表结构和内容是...同时,对SQL语句的优化也是提高数据库性能的关键,比如合理选择索引、避免全表扫描、减少数据类型转换等。在实际操作中,要结合业务需求和数据库特性,灵活运用这些技巧。

    Mysql查询语句大全[借鉴].pdf

    这将显示两张表中相等的部门号所有字段。也可以使用以下查询语句来查询员工表中的部门号,并且条件是员工表中部门号与部门表中部门号相等: ```sql select tb_e.deptno from tb_e, tb_d where tb_e.deptno=tb_d....

    oracle,sqlserver及mysql对比

    Oracle、SQL Server 及 MySQL 的查询语句执行顺序相同:开始-&gt;FROM 子句-&gt;WHERE 子句-&gt;GROUP BY 子句-&gt;HAVING 子句-&gt;ORDER BY 子句-&gt;SELECT 子句-&gt;LIMIT 子句。每个子句执行后都会产生一个中间结果,供接下来的子句...

    MySQL简单语句

    根据提供的文件内容,我们可以整理出一系列有关MySQL的基本操作知识点,主要涵盖了数据定义语言(DDL)、数据操纵语言(DML)、数据查询语言(DQL)以及一些高级查询技巧。接下来,我们将详细阐述这些知识点。 ### ...

    Mysql跨表更新 多表update sql语句总结

    本文主要总结了在MySQL中进行多表更新的不同SQL语句写法,适用于需要根据一张表中的数据来更新另一张表的情况。 首先,我们可以使用传统的`UPDATE`语句与两张表的简单联接(JOIN)来实现跨表更新。例如,假设有`...

    21天学会SQL语句——SQL21自学通

    ### 21天学会SQL语句——SQL21自学通 #### 第一部分:SQL基础知识概述 **SQL**(Structured Query Language)是一种用于管理和处理数据库的标准计算机语言。它被广泛应用于各种数据库系统中,如MySQL、Oracle、SQL...

    mysql查询语句汇总基本语法.doc

    如果有两张表`students`和`courses`,分别代表学生和课程信息,并且通过`student_id`关联。为了获取每个学生及其所选课程的列表,可以使用`INNER JOIN`: ```sql SELECT students.name, courses.course_name FROM ...

Global site tag (gtag.js) - Google Analytics