Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql Join 2表并选择日期范围之间的最大值和最小值_Mysql_Join - Fatal编程技术网

Mysql Join 2表并选择日期范围之间的最大值和最小值

Mysql Join 2表并选择日期范围之间的最大值和最小值,mysql,join,Mysql,Join,我有两张桌子,订单和价格。我想连接这两个表,并选择opentime和closetime之间的最大值和最小值 表1:订单 表2:费率 预期结果 我尝试此查询,但得到的结果为空 SELECT id,type,pair,lot,opentime,openprice,closeprice,closetime,high,timehigh,low,timelow FROM (SELECT id,type,pair,lot,opentime,openprice,closeprice,closetime FRO

我有两张桌子,订单和价格。我想连接这两个表,并选择opentime和closetime之间的最大值和最小值

表1:订单 表2:费率 预期结果 我尝试此查询,但得到的结果为空

SELECT id,type,pair,lot,opentime,openprice,closeprice,closetime,high,timehigh,low,timelow FROM (SELECT id,type,pair,lot,opentime,openprice,closeprice,closetime FROM `order` ORDER BY closetime DESC) table1 
JOIN (SELECT MAX(price) as high,time as timehigh,pair as pairhigh FROM `rates` GROUP BY pair) table2 ON table1.pair=table2.pairhigh 
JOIN (SELECT MIN(price) as low,time as timelow,pair as pairlow FROM `rates` GROUP BY pair) table3 ON table1.pair=table3.pairlow 
WHERE table2.timehigh between table1.opentime and table1.closetime AND table3.timelow between table1.opentime and table1.closetime
尝试不带where子句的查询获取结果不为空但不应为空

SELECT id,type,pair,lot,opentime,openprice,closeprice,closetime,high,timehigh,low,timelow FROM (SELECT id,type,pair,lot,opentime,openprice,closeprice,closetime FROM `order` ORDER BY closetime DESC) table1 
JOIN (SELECT MAX(price) as high,time as timehigh,pair as pairhigh FROM `rates` GROUP BY pair) table2 ON table1.pair=table2.pairhigh 
JOIN (SELECT MIN(price) as low,time as timelow,pair as pairlow FROM `rates` GROUP BY pair) table3 ON table1.pair=table3.pairlow
结果
如何解决这个问题?

我相信这符合您的要求了吗

SELECT *
FROM Orders
JOIN (SELECT price as maxPrice, pair, tr_time as maxTime FROM Rates
    JOIN (SELECT Rates.pair, MAX(Rates.price) AS price
        FROM Rates, Orders 
        WHERE (Rates.tr_time between Orders.opentime and Orders.closetime) 
        GROUP BY Rates.pair) 
    as MaxPrices USING (price, pair)) maxRates USING (pair)
JOIN (SELECT price AS minPrice, pair, tr_time as minTime FROM Rates
        JOIN (SELECT Rates.pair, MIN(Rates.price) AS price
            FROM Rates, Orders 
            WHERE (Rates.tr_time between Orders.opentime and Orders.closetime) 
            GROUP BY Rates.pair) 
    as minPrices USING (price, pair)) minRates USING (pair);
您的代码结构太差,我无法真正了解到底发生了什么,但实际上,您似乎不知道聚合运算符(如
MAX()
只返回一个值)

您还不清楚您想要的最低/最高价格是多少(我假设它是每

运行代码,看看它是否返回正确?如果不告诉我哪里不匹配,我可以开始修补它

编辑 新结果:


试试这个,它会按您的预期结果输出,可能对您有用;)

MySQL 5.6架构

CREATE TABLE orders
    (`id` int, `type` varchar(4), `pair` varchar(6), `lot` float, `opentime` datetime, `openprice` float, `closeprice` float, `closetime` datetime)
;

INSERT INTO orders
    (`id`, `type`, `pair`, `lot`, `opentime`, `openprice`, `closeprice`, `closetime`)
VALUES
    (1, 'buy', 'eurusd', 0.01, '2016-05-02 02:04:07', 1.15112, 1.14778, '2016-05-02 03:05:00'),
    (2, 'sell', 'gbpusd', 0.01, '2016-05-02 02:24:17', 1.45221, 1.44989, '2016-05-02 03:05:00')
;


CREATE TABLE rates
    (`id` int, `pair` varchar(6), `time` datetime, `price` float)
;

INSERT INTO rates
    (`id`, `pair`, `time`, `price`)
VALUES
    (10, 'eurusd', '2016-05-02 03:00:00', 1.14522),
    (9, 'gbpusd', '2016-05-02 03:00:00', 1.44726),
    (8, 'eurusd', '2016-05-02 02:30:00', 1.15258),
    (7, 'gbpusd', '2016-05-02 02:30:00', 1.45311),
    (6, 'eurusd', '2016-05-02 02:00:00', 1.15051),
    (5, 'gbpusd', '2016-05-02 02:00:00', 1.45173),
    (4, 'eurusd', '2016-05-01 01:30:00', 1.14258),
    (3, 'gbpusd', '2016-05-02 01:30:00', 1.44326),
    (2, 'eurusd', '2016-05-02 01:00:00', 1.15751),
    (1, 'gbpusd', '2016-05-02 01:00:00', 1.45911)
;
SELECT DISTINCT
orders.*, mx.high, R1.time AS timehigh, mn.low, R2.time AS timelow
FROM orders
LEFT JOIN (
    SELECT orders.pair, rates.time, max(rates.price) AS high
    FROM orders
    JOIN rates ON orders.pair = rates.pair AND rates.time <= orders.closetime AND rates.time >= orders.opentime
    group by orders.pair
) mx ON mx.pair = orders.pair
LEFT JOIN (
    SELECT orders.pair, min(rates.price) AS low, rates.time
    FROM orders
    JOIN rates ON orders.pair = rates.pair AND rates.time <= orders.closetime AND rates.time >= orders.opentime
    GROUP BY orders.pair
) mn ON mn.pair = orders.pair
LEFT JOIN rates R1 ON mx.pair = R1.pair and R1.price = mx.high
LEFT JOIN rates R2 ON mn.pair = R2.pair and R2.price = mn.low
| id | type |   pair |  lot |              opentime | openprice | closeprice |             closetime |    high |                  time |     low |                  time |
|----|------|--------|------|-----------------------|-----------|------------|-----------------------|---------|-----------------------|---------|-----------------------|
|  1 |  buy | eurusd | 0.01 | May, 02 2016 02:04:07 |   1.15112 |    1.14778 | May, 02 2016 03:05:00 | 1.15258 | May, 02 2016 02:30:00 | 1.14522 | May, 02 2016 03:00:00 |
|  2 | sell | gbpusd | 0.01 | May, 02 2016 02:24:17 |   1.45221 |    1.44989 | May, 02 2016 03:05:00 | 1.45311 | May, 02 2016 02:30:00 | 1.44726 | May, 02 2016 03:00:00 |
查询1

CREATE TABLE orders
    (`id` int, `type` varchar(4), `pair` varchar(6), `lot` float, `opentime` datetime, `openprice` float, `closeprice` float, `closetime` datetime)
;

INSERT INTO orders
    (`id`, `type`, `pair`, `lot`, `opentime`, `openprice`, `closeprice`, `closetime`)
VALUES
    (1, 'buy', 'eurusd', 0.01, '2016-05-02 02:04:07', 1.15112, 1.14778, '2016-05-02 03:05:00'),
    (2, 'sell', 'gbpusd', 0.01, '2016-05-02 02:24:17', 1.45221, 1.44989, '2016-05-02 03:05:00')
;


CREATE TABLE rates
    (`id` int, `pair` varchar(6), `time` datetime, `price` float)
;

INSERT INTO rates
    (`id`, `pair`, `time`, `price`)
VALUES
    (10, 'eurusd', '2016-05-02 03:00:00', 1.14522),
    (9, 'gbpusd', '2016-05-02 03:00:00', 1.44726),
    (8, 'eurusd', '2016-05-02 02:30:00', 1.15258),
    (7, 'gbpusd', '2016-05-02 02:30:00', 1.45311),
    (6, 'eurusd', '2016-05-02 02:00:00', 1.15051),
    (5, 'gbpusd', '2016-05-02 02:00:00', 1.45173),
    (4, 'eurusd', '2016-05-01 01:30:00', 1.14258),
    (3, 'gbpusd', '2016-05-02 01:30:00', 1.44326),
    (2, 'eurusd', '2016-05-02 01:00:00', 1.15751),
    (1, 'gbpusd', '2016-05-02 01:00:00', 1.45911)
;
SELECT DISTINCT
orders.*, mx.high, R1.time AS timehigh, mn.low, R2.time AS timelow
FROM orders
LEFT JOIN (
    SELECT orders.pair, rates.time, max(rates.price) AS high
    FROM orders
    JOIN rates ON orders.pair = rates.pair AND rates.time <= orders.closetime AND rates.time >= orders.opentime
    group by orders.pair
) mx ON mx.pair = orders.pair
LEFT JOIN (
    SELECT orders.pair, min(rates.price) AS low, rates.time
    FROM orders
    JOIN rates ON orders.pair = rates.pair AND rates.time <= orders.closetime AND rates.time >= orders.opentime
    GROUP BY orders.pair
) mn ON mn.pair = orders.pair
LEFT JOIN rates R1 ON mx.pair = R1.pair and R1.price = mx.high
LEFT JOIN rates R2 ON mn.pair = R2.pair and R2.price = mn.low
| id | type |   pair |  lot |              opentime | openprice | closeprice |             closetime |    high |                  time |     low |                  time |
|----|------|--------|------|-----------------------|-----------|------------|-----------------------|---------|-----------------------|---------|-----------------------|
|  1 |  buy | eurusd | 0.01 | May, 02 2016 02:04:07 |   1.15112 |    1.14778 | May, 02 2016 03:05:00 | 1.15258 | May, 02 2016 02:30:00 | 1.14522 | May, 02 2016 03:00:00 |
|  2 | sell | gbpusd | 0.01 | May, 02 2016 02:24:17 |   1.45221 |    1.44989 | May, 02 2016 03:05:00 | 1.45311 | May, 02 2016 02:30:00 | 1.44726 | May, 02 2016 03:00:00 |

我想davidhood2已经搞定了,但以防万一

SELECT a.* 
     , b.price high
     , b.time timehigh
     , c.price low
     , c.time timelow
  FROM orders a
  JOIN
     ( SELECT x.pair
            , x.price 
            , x.time
         FROM rates x 
         JOIN  
            ( SELECT r.pair
                   , MAX(r.price) price 
                FROM rates r 
                JOIN orders o 
                  ON o.pair = r.pair 
                 AND r.time BETWEEN o.opentime AND o.closetime 
               GROUP 
                  BY pair
            ) y 
           ON y.pair = x.pair 
          AND y.price = x.price
     ) b
    ON b.pair = a.pair
  JOIN
     ( SELECT x.pair
            , x.price 
            , x.time
         FROM rates x 
         JOIN  
            ( SELECT r.pair
                   , MIN(r.price) price 
                FROM rates r 
                JOIN orders o 
                  ON o.pair = r.pair 
                 AND r.time BETWEEN o.opentime AND o.closetime 
               GROUP 
                  BY pair
            ) y 
           ON y.pair = x.pair 
          AND y.price = x.price
     ) c
    ON c.pair = a.pair;

+------+------+--------+------+---------------------+-----------+------------+---------------------+---------+---------------------+---------+---------------------+
| id   | type | pair   | lot  | opentime            | openprice | closeprice | closetime           | high    | timehigh            | low     | timelow             |
+------+------+--------+------+---------------------+-----------+------------+---------------------+---------+---------------------+---------+---------------------+
|    1 | buy  | eurusd | 0.01 | 2016-05-02 02:04:07 |   1.15112 |    1.14778 | 2016-05-02 03:05:00 | 1.15258 | 2016-05-02 02:30:00 | 1.14522 | 2016-05-02 03:00:00 |
|    2 | sell | gbpusd | 0.01 | 2016-05-02 02:24:17 |   1.45221 |    1.44989 | 2016-05-02 03:05:00 | 1.45311 | 2016-05-02 02:30:00 | 1.44726 | 2016-05-02 03:00:00 |
+------+------+--------+------+---------------------+-----------+------------+---------------------+---------+---------------------+---------+---------------------+

有sqlfiddle吗?没有sqlfiddle@strawberryOh多么不幸为什么不幸的@strawberryOh如果你提供了一些create/insert语句,这样人们就不必手动键入所有内容来调试了,这会更容易,不是1:30时的低点吗?这是行不通的。聚合结果中的非分组列是不确定的。考虑到所做的努力,否决票是苛刻的,但这个解决方案是错误的。正如对问题的描述,
评级。时间
介于
订单之间。开放时间
订单之间。关闭时间
,不是吗?啊,也许是。然而,这仍然会产生一个不确定的结果。如果您确定我的错误,您可以在我的sql中指出它,并给我们一个正确的答案,为什么要投否决票?即使你有很高的声誉,或者你是MySQL的专家,你也不能否认这一点,也不能给我们一个正确的答案。这样做是不恰当的。谢谢你的否决票…@草莓你能给我们一个正确的答案吗?我相信我已经改正了。我还确信,您的预期结果中存在一个错误-对于英镑->美元,1.44726@0300不是营业时间间隔内的最低值,1.45311@0230更低?我已再次编辑。Change现在选择lowest,然后将其联接以获得正确的(确定的)时间,然后将其联接到显示开始/结束时间的开销表中—因为price是非键的。但是,如果您交叉连接,然后使用where语句来坚持价格和对字段中的相等性,这将起作用…请参阅代码更新(我知道聚合语句现在返回两个,但第二个字段是group by属性…)谢谢@davidhood,您的查询按预期工作。我几乎不做任何更改,因为GROUP BY Rates.pair不适用于同一对,具有同一对的所有订单只显示一个结果。而且你的查询速度很慢。。152行订单和12k行费率需要25分钟。你对如何让你的查询运行得更快有什么建议吗?哇,我不知道你的答案和我的答案有什么本质的区别…我只是把
左连接率
从子查询中去掉了,真是谢天谢地的否决票@雷诺-我已经解释了本质上的区别。这不是左连接。这是你结果的不确定性。
SELECT a.* 
     , b.price high
     , b.time timehigh
     , c.price low
     , c.time timelow
  FROM orders a
  JOIN
     ( SELECT x.pair
            , x.price 
            , x.time
         FROM rates x 
         JOIN  
            ( SELECT r.pair
                   , MAX(r.price) price 
                FROM rates r 
                JOIN orders o 
                  ON o.pair = r.pair 
                 AND r.time BETWEEN o.opentime AND o.closetime 
               GROUP 
                  BY pair
            ) y 
           ON y.pair = x.pair 
          AND y.price = x.price
     ) b
    ON b.pair = a.pair
  JOIN
     ( SELECT x.pair
            , x.price 
            , x.time
         FROM rates x 
         JOIN  
            ( SELECT r.pair
                   , MIN(r.price) price 
                FROM rates r 
                JOIN orders o 
                  ON o.pair = r.pair 
                 AND r.time BETWEEN o.opentime AND o.closetime 
               GROUP 
                  BY pair
            ) y 
           ON y.pair = x.pair 
          AND y.price = x.price
     ) c
    ON c.pair = a.pair;

+------+------+--------+------+---------------------+-----------+------------+---------------------+---------+---------------------+---------+---------------------+
| id   | type | pair   | lot  | opentime            | openprice | closeprice | closetime           | high    | timehigh            | low     | timelow             |
+------+------+--------+------+---------------------+-----------+------------+---------------------+---------+---------------------+---------+---------------------+
|    1 | buy  | eurusd | 0.01 | 2016-05-02 02:04:07 |   1.15112 |    1.14778 | 2016-05-02 03:05:00 | 1.15258 | 2016-05-02 02:30:00 | 1.14522 | 2016-05-02 03:00:00 |
|    2 | sell | gbpusd | 0.01 | 2016-05-02 02:24:17 |   1.45221 |    1.44989 | 2016-05-02 03:05:00 | 1.45311 | 2016-05-02 02:30:00 | 1.44726 | 2016-05-02 03:00:00 |
+------+------+--------+------+---------------------+-----------+------------+---------------------+---------+---------------------+---------+---------------------+