我有以下结构:
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,我已经把狗扔进了混合物。
答案 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
三次:
容易!