MYSQL查询-获取更改价格的行

MYSQL查询-获取更改价格的行,mysql,Mysql,我有两张桌子。订单和订单项。订单表包含日期,orderitem表包含该订单的数量和价格。我想找出价格变动的日期。例如,今天的价格是10,2天后变为11,然后在接下来的5天内保持11,然后在5天后再次变为10,因此结果将是3个日期10、11、10,并且日期将是价格更改的日期 Date price '2015-04-29 14:48:23', 15.99 '2015-04-30 14:20:11', 15.

我有两张桌子。订单和订单项。订单表包含日期,orderitem表包含该订单的数量和价格。我想找出价格变动的日期。例如,今天的价格是10,2天后变为11,然后在接下来的5天内保持11,然后在5天后再次变为10,因此结果将是3个日期10、11、10,并且日期将是价格更改的日期

        Date                     price

        '2015-04-29 14:48:23',  15.99
        '2015-04-30 14:20:11',  15.99
        '2015-04-30 21:05:11',  15.99
        '2015-05-04 01:41:12',  15.99
        '2015-07-28 05:52:20',  15.99
        '2015-07-29 16:55:48',  15.99
        '2015-08-01 00:31:53',  15.99
        '2015-08-15 22:41:49',  15.99
        '2015-08-17 02:37:43',  15.99
        '2015-08-17 13:28:03',  15.99
        '2015-08-23 04:16:31',  15.99   
        '2015-08-27 08:43:48',  15.99
        '2015-08-28 18:42:27',  15.99
        '2015-08-29 15:47:17',  15.99
        '2015-08-30 03:33:15',  15.99
        '2015-10-29 03:45:25',  15.99
        '2015-10-29 18:24:20',  15.99
        '2015-10-30 18:17:18',  15.99
        '2015-11-02 15:28:16',  16.99
        '2015-11-03 01:59:03',  16.99
        '2015-11-14 18:22:39',  16.99
        '2015-11-20 02:48:59',  16.99
        '2015-12-16 18:59:54',  16.99
        '2015-12-28 04:08:22',  16.99
        '2016-01-12 03:21:35',  16.99
        '2016-01-18 00:43:56',  16.99
        '2016-01-18 20:11:23',  16.99
        '2016-02-10 19:07:57',  16.99
        '2016-02-26 14:24:29',  16.99
        '2016-03-28 10:17:24',  16.99
        '2016-03-31 23:33:53',  16.99
        '2016-04-01 20:03:03',  17.99
        '2016-05-31 20:30:50',  15.99
我想知道所有价格变动的日期。这里的输出是

i、 e.显示价格变更的日期

到目前为止,我已经编写了这个MYSQL查询,但它给出了所有行,并且没有过滤结果:

         SELECT date, price FROM orderitem
         inner join orders o1 on o1.orderid = orderitem.orderid
         where productname = 'IBC'
        and price <> (
        select price from orderitem
        inner join orders on orders.orderid = orderitem.orderid
        where orders.date< o1.date
        order by date desc
        limit 1
        )

任何建议都将不胜感激。

对于类似的内容,您需要两次通过,因为您将比较每一行与前一行

这样做的一种方法是首先:

SET @lastprice = 0.0;
然后,您的第一个过程将如下所示:

SELECT `Date`, @lastprice AS `oldprice`, @lastprice := `price` AS `newprice`
FROM `tablename` ORDER BY `Date` ASC;
这里的顺序很重要,因为您希望构建一个按时间顺序排列的时间线

然后,您需要做的就是从这个结果中检索新旧价格不同的行。这样做可以:

SELECT * FROM ("Above subquery here") `tmp` WHERE `oldprice` != `newprice`;
您的最终查询如下所示:

SET @lastprice = 0.0;
SELECT * FROM (
    SELECT `Date`, @lastprice AS `oldprice`, @lastprice := `price` AS `newprice`
    FORM `tablename` ORDER BY `Date` ASC
) `tmp`
WHERE `oldprice` != `newprice`;
SET @lastprice = 0.0;
CREATE TEMPORARY TABLE `tmp`
    SELECT `Date`, @lastprice AS `oldprice`, @lastprice := `price` AS `newprice`
    FROM `tablename` ORDER BY `Date` ASC;
SELECT * FROM `tmp` WHERE `oldprice` != `newprice`;
DROP TEMPORARY TABLE `tmp`;
或者,您可能更喜欢使用临时表来存储子查询结果。在这种情况下,它看起来像这样:

SET @lastprice = 0.0;
SELECT * FROM (
    SELECT `Date`, @lastprice AS `oldprice`, @lastprice := `price` AS `newprice`
    FORM `tablename` ORDER BY `Date` ASC
) `tmp`
WHERE `oldprice` != `newprice`;
SET @lastprice = 0.0;
CREATE TEMPORARY TABLE `tmp`
    SELECT `Date`, @lastprice AS `oldprice`, @lastprice := `price` AS `newprice`
    FROM `tablename` ORDER BY `Date` ASC;
SELECT * FROM `tmp` WHERE `oldprice` != `newprice`;
DROP TEMPORARY TABLE `tmp`;

具体的实施取决于您,但这将是一个很好的方法。

谢谢Niet,但此解决方案不会给出正确的结果。如果我有两个相同价格的日期,比如15.99,并且4月20日和4月23日的价格变化相同,那么它将给出4月23日,而不是返回4月20日