2015-10-20 131 views
2

輸出的專欄中,我有一個情況,考慮以下查詢:如何從第一行減去第二行和生成的MySQL

select 
    A.cakename, A.status, B.ordertime 
from 
    Cake as A 
     inner join 
    Orders as B on A.cakeid = B.cakeid 

此查詢的輸出現在

cakename, status,  ordertime 
Apple Pie, available, 2014-03-20 22:34:46 
Apple Pie, available, 2014-10-10 04:00:00 
Apple Pie, available, 2015-03-20 22:34:46 
Brownie, available, 2014-03-20 22:35:07 
Brownie, available, 2015-05-20 22:35:07 
Brownie, available, 2014-03-26 22:36:07 
Brownie, available, 2015-05-20 14:35:48 
Brownie, available, 2015-05-20 22:35:07 
Brownie, available, 2015-05-10 22:35:07 

我想減去ordertime row n+1 - ordertime row n並創建一個單獨的列來存儲結果。現在你可以忽略最後一行,因爲沒有下一行。

例如:2014-10-10 04:00:00 - 2014-03-20 22:34:46這個公式將用於第一行,其結果將存儲在一個新列中讓我們取difference of consecutive ordertime。任何人都可以給我一些指示來解決這種情況嗎?

如果你可以幫助創建一個auto increment column這將是偉大的,因爲那樣我就可以自我加入,並採取差異。

回答

2

你可以添加額外的計算字段:

select 
A.cakename, A.status, B.ordertime, 
(SELECT MAX(ordertime) FROM Orders AS C WHERE C.ordertime < B.ordertime) AS prev 
from 
Cake as A 
    inner join 
Orders as B on A.cakeid = B.cakeid 
ORDER BY ordertime; 

但你會更好的對ordertime索引:

CREATE INDEX ord_ndx ON Orders(ordertime, cakeid); 

其實,你可以直接計算the difference from the previous time(假設它不是NULL;你必須爲IF提供一個默認值)。

一種不同的方式

但是,根據你的架構,你可能會更好地添加一列(previous_order)提供服務。當你插入一個訂單,你知道你需要什麼。請參閱使用TRIGGER這個例子:

CREATE TABLE test (itemid integer, ordertime timestamp, previous datetime); 
CREATE INDEX test_ndx ON test (itemid, ordertime); 

CREATE TRIGGER test_set_prev 
    BEFORE INSERT ON test 
    FOR EACH ROW 
     SET NEW.previous = (
      SELECT MAX(ordertime) FROM test WHERE itemid = NEW.itemid 
     ); 

現在你表自動工作。時間戳列會自動更新,並因此將previous柱:

insert into test (itemid) values (2); 
select sleep(2); 
insert into test (itemid) values (2); 

+--------+---------------------+---------------------+ 
| itemid | ordertime   | previous   | 
+--------+---------------------+---------------------+ 
|  2 | 2015-10-21 09:30:44 | NULL    | 
|  2 | 2015-10-21 09:30:46 | 2015-10-21 09:30:44 | 
+--------+---------------------+---------------------+ 

它還可以與多個插件:

insert into test (itemid) values (3), (2), (3); 
+0

我修改您的查詢,這是爲我工作:)謝謝你這麼多 – python

+0

'選擇 A.cakename, A.status, B.ordertime, (SELECT TIMESTAMPDIFF(月, MAX(ORD ertime) B.ordertime) FROM 訂單爲C WHERE C.ordertime python

2
SELECT t.*, 
    IF(@prev IS NULL ,0 , TIMESTAMPDIFF(SECOND,t.ordertime,@prev)) diff, 
    @prev = t.ordertime 
FROM (
    SELECT 
    A.cakename, A.status, B.ordertime 
    FROM Cake as A 
    INNER JOIN Orders as B 
    ON A.cakeid = B.cakeid 
    ORDER BY ordertime 
) t 
+1

給我不正確的結果。 – python

+0

播種證明和發佈預期結果?你能提供sqlfiddle進行測試嗎? – Alex

+0

這是一個體改查詢@Iserni回答,它爲我工作'選擇 A.cakename, A.status, B.ordertime, (SELECT TIMESTAMPDIFF(月, MAX(ordertime), B.ordertime) FROM 訂單爲C WHERE C.ordertime python

相關問題