按时间排序,仅显示唯一的位置

时间:2012-09-04 17:10:43

标签: mysql sql

我有以下结构:

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,我已经把狗扔进了混合物。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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获取所有行(我们称之为当前),使其价格与前一行的价格不同,具体取决于备用键 time <的值/ em>(我们称之为之前的)。

为此,我们需要一个correlated subquery来标识time的最高值,该值小于或等于当前行的time的值。所以...我们最后引用myTable三次:

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

容易!