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

時間がテーブルの代替キーであるという事実を利用しています。( currentmyTableと呼びましょう)からすべての行を取得し、その価格が代替キーtimeの値に基づいて前の行の価格とは異なるようにします (このセットをpreviousと呼びましょう)。

これを行うには、現在の行のの値以下の最大値を識別する相関サブクエリが必要です。したがって... 3 回参照することになります。timetimemyTable

  • まず、「現在の」行のセットについて、
  • 次に、「前の」行のセットについて
  • 3 番目に、「現在」行のデータに基づいて「前」行を識別します。

簡単!

于 2012-09-04T17:41:30.143 に答える