连接两个表带来不匹配的值MYSQL

Posted

技术标签:

【中文标题】连接两个表带来不匹配的值MYSQL【英文标题】:Join two tables bring mismatch values MYSQL 【发布时间】:2021-03-08 04:12:27 【问题描述】:

我有两个超过 400 万条记录的表,我需要进行选择查询,其中两列匹配会在此匹配中带来两个表的值,然后我会将其插入到第 3 个表中:

这是表 A:(bitfinex)

这是表 B:(Kraken)

我需要在时间戳和 exchange_pair 匹配的地方进行 SELECT,正如您在表 B 中的这张图片中看到的那样,相同的时间戳可以有多个 exchange_pair,我需要做的是将那些与其他表列匹配并带上两个表内容

这是我一次使用的查询,但在分析结果时,我在连接上有一些不匹配的值(我没有找到关系,它不是时间戳或交换对)我想知道我的查询语法是否正确我正在寻找的结果。

INSERT IGNORE INTO spreads(timestamp,exchange_pair,platform_a,platform_b,a_bid_price,b_bid_price, high_value,spread_percentage,spread)
SELECT B.timestamp, B.exchange_pair,'bitfinex' as platform_a,'kraken' as platform_b,
 B.bid,
 K.bid_price,
 (SELECT IF (B.bid>K.bid_price,B.bid,K.bid_price)),
 (SELECT (((ABS(K.bid_price - B.bid))*100)/(SELECT IF (B.bid>K.bid_price,B.bid,K.bid_price)))),
  ABS(K.bid_price - B.bid)  AS spread
FROM bitfinex AS B
JOIN kraken AS K
 ON B.timestamp = K.timestamp
JOIN kraken AS K2
 ON B.exchange_pair = K2.exchange_pair
WHERE K.exchange_pair = B.exchange_pair AND B.timestamp = K.timestamp ;

如果使用内部连接或仅连接,我仍然感到困惑,我还添加了“Where”子句以确保交换对和时间戳匹配。

【问题讨论】:

你想要哪几行?您的示例中的哪些行来自哪个表?对于不同步的时间戳,您需要怎么做? 【参考方案1】:

怎么样:

select b.timestamp, b.exchange_pair, b.bid, k.ask_array_price
from bitfinex b
join kraken k on k.timestamp = b.timestamp and k.exchange_pair = b.exchange_pair 

我建议任何有关 SQL 查询的问题都可以用脚本来补充,以便快速有效地设置所需的表和包含的数据,以便尽快开始编写查询。发送者知道如何做这件事对发送者有好处,对接收者也有好处,因为一旦表格和数据到位,就可以开始回答问题。

我承认,在这种特殊情况下,解决方案可能很简单,不必经历整个过程,但尽管如此。

以下是此类脚本的外观示例(针对此特定问题):

第 1 步:创建 bitfinex 表

CREATE TABLE test.bitfinex (
    `timestamp` DATETIME NOT NULL,
    exchange_pair varchar(30) NULL,
    bid double NULL,
    id int auto_increment NOT NULL
)
ENGINE=InnoDB
DEFAULT CHARSET=latin1;

第 2 步:创建海妖表

CREATE TABLE test.kraken (
    id INT auto_increment NOT NULL,
    `timestamp` DATETIME NULL,
    exchange_pair varchar(30) NULL,
    ask_array_price DOUBLE NULL
)
ENGINE=InnoDB
DEFAULT CHARSET=latin1;

第 3 步:用示例数据(或相关的真实数据)填充 bitfinex 表

insert into bitfinex (timestamp, exchange_pair, bid)
select *,rand() * 1000 from 
(
select '2021/3/3 9:34:55' timestamp
union all
select '2021/3/3 9:34:56'
union all
select '2021/3/3 9:34:57'
union all
select '2021/3/3 9:34:58'
) a
cross join
(
select 'ETH-USD' exchange_pair
union all
select 'BTC-USD'
union all
select 'ETH-BTC'
) b

    用数据填充海妖表

    插入海妖(时间戳,exchange_pair,ask_array_price) 选择时间戳,exchange_pair,rand() * 1000 从 比特币

【讨论】:

以上是关于连接两个表带来不匹配的值MYSQL的主要内容,如果未能解决你的问题,请参考以下文章

如何在雪花的左外连接期间提取所有值(即使是那些不匹配的值)?

mysql命令总结

MySQL——联表查询

日期不匹配时连接两个表

26.MySQL中的内连接INNER JOIN

MySQL左外连接与where子句 - 返回不匹配的行