2

我有以下结构:

CREATE TABLE IF NOT EXISTS `myTable` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `time` int(11) NOT NULL,
  `item` varchar(255) NOT NULL,
  `price` int(11) NOT NULL,
  PRIMARY KEY (`ID`),
  KEY `time` (`time`),
  KEY `item` (`item`),
  KEY `price` (`price`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=8 ;


INSERT INTO `myTable` (`ID`, `time`, `item`, `price`) VALUES
(1, 100, 'cat', 10),
(2, 101, 'cat', 10),
(3, 102, 'cat', 9),
(4, 103, 'cat', 11),
(5, 104, 'cat', 10),
(6, 105, 'cat', 10),
(7, 106, 'cat', 11);

我试图找出一个返回以下内容的查询:

time   item   price
----   ----   -----
100    cat    10
102    cat    9
103    cat    11
104    cat    10
106    cat    11

它按时间排序,并且仅显示价格与其之前的价格不同的行(编辑: *根据时间*)。

编辑:

也许我把原来的问题弄得太简单了,如果用这样的数据更复杂怎么办:

INSERT INTO `myTable` (`ID`, `time`, `item`, `price`) VALUES
(1111, 100, 'cat', 10),
(21, 105, 'cat', 10),
(31, 108, 'cat', 9),
(411, 109, 'cat', 11),
(512, 110, 'cat', 10),
(61, 114, 'cat', 10),
(72, 120, 'cat', 11),
(8, 100, 'dog', 20),
(93, 102, 'dog', 20),
(104, 108, 'dog', 29),
(111, 109, 'dog', 31),
(122, 155, 'dog', 20),
(13, 165, 'dog', 20),
(1445, 172, 'dog', 31);

在上面,ID列都乱了,可能中间还有其他记录。此外,时间不再以 1 递增,我将一只狗扔进了混合物中。

4

2 回答 2

2

此查询将为每一行获取前一个 ID 的价格,并进行比较,如果不同则显示它

select time, item, price
from mytable T1
where price != (select price from mytable where id < t1.id order by id desc limit 1) or T1.id = 1
于 2012-09-04T17:14:41.577 回答
2

您需要的查询是这样的:

select curr.time  ,
       curr.item  ,
       curr.price 
from myTable curr
join myTable prev on prev.time = ( select max(time)
                                   from myTable p
                                   where p.time < curr.time
                                 )
where curr.price != prev.price
order by t.time

它利用了时间是表的备用键这一事实。我们从myTable(我们称其为current )中获取所有行,使其价格与基于备用键time的值的前一行的价格不同(我们将此集合称为previous)。

为此,我们需要一个相关的子查询来标识当前行time小于或等于的值的最大值。time所以......我们最终引用了myTable三次:

  • 首先,对于“当前”行的集合,
  • 其次,对于“前一个”行的集合
  • 第三,根据“当前”行中的数据识别“上一个”行。

简单的!

于 2012-09-04T17:41:30.143 回答