2014-07-25 43 views
0

我有一個選擇的結果是這樣的:如何在MySQL上的特定行之前選擇一行,如果該表是按日期排序?

ID | DATE 
---------------- 
10 | 2014-07-23 
7 | 2014-07-24 
8 | 2014-07-24 
9 | 2014-07-24 
1 | 2014-07-25 
2 | 2014-07-25 
6 | 2014-07-25 
3 | 2014-07-26 
4 | 2014-07-27 
5 | 2014-07-28 

結果上面按日期順序。現在,我要選擇一個以前的行之前:

2 | 2014-07-25 

那就是:

1 | 2014-07-25 

在情況下,我不知道確切的ID和條件碼必須是一個,如果我想兼容選擇的上一行:

3 | 2014-07-26 

那就是:

6 | 2014-07-25 

我應該使用什麼條件?

UPDATE

嘗試這樣:

SET @rank=0; 
SELECT @rank:[email protected]+1 AS rank, t1.* 
    FROM table t1 

然後我得到這個:

RANK | ID | DATE 
---------------- 
1 | 10 | 2014-07-23 
2 | 7 | 2014-07-24 
3 | 8 | 2014-07-24 
4 | 9 | 2014-07-24 
5 | 1 | 2014-07-25 
6 | 2 | 2014-07-25 
7 | 6 | 2014-07-25 
8 | 3 | 2014-07-26 
9 | 4 | 2014-07-27 
10 | 5 | 2014-07-28 

然後我嘗試這樣的:

SET @rank=0; 
SELECT @rank:[email protected]+1 AS rank, t1.* 
    FROM table t1 
    WHERE rank < 3; 

我得到了這個錯誤:'where子句'中的未知列'等級'。

+0

什麼輸入?該行的「ID」(即第一種情況下爲2)? –

+1

在其他數據庫中,這是一個LAG窗口功能。 – Randy

+0

「*以上表格按日期排序*」 - 不,不是。關係數據庫中的行未排序。您的_result_按日期排序,而不是「表格」 –

回答

2

這裏有一種方法......

DROP TABLE IF EXISTS my_table; 

CREATE TABLE my_table 
(ID INT NOT NULL PRIMARY KEY 
,DATE DATE NOT NULL 
); 

INSERT INTO my_table VALUES 
(10 ,'2014-07-23'), 
(7 ,'2014-07-24'), 
(8 ,'2014-07-24'), 
(9 ,'2014-07-24'), 
(1 ,'2014-07-25'), 
(2 ,'2014-07-25'), 
(6 ,'2014-07-25'), 
(3 ,'2014-07-26'), 
(4 ,'2014-07-27'), 
(5 ,'2014-07-28'); 

SELECT a.id 
    , a.date 
    , b.id b_id 
    , b.date b_date 
    FROM 
    (SELECT x.* 
      , COUNT(*) rank 
     FROM my_table x 
     JOIN my_table y 
      ON (y.date < x.date) 
      OR (y.date = x.date AND y.id <= x.id) 
     GROUP 
      BY x.date 
     , x.id 
    ) a 
    LEFT 
    JOIN 
    (SELECT x.* 
      , COUNT(*) rank 
     FROM my_table x 
     JOIN my_table y 
      ON (y.date < x.date) 
      OR (y.date = x.date AND y.id <= x.id) 
     GROUP 
      BY x.date 
     , x.id 
    ) b 
    ON b.rank = a.rank - 1; 


+----+------------+------+------------+ 
| id | date  | b_id | b_date  | 
+----+------------+------+------------+ 
| 10 | 2014-07-23 | NULL | NULL  | 
| 7 | 2014-07-24 | 10 | 2014-07-23 | 
| 8 | 2014-07-24 | 7 | 2014-07-24 | 
| 9 | 2014-07-24 | 8 | 2014-07-24 | 
| 1 | 2014-07-25 | 9 | 2014-07-24 | 
| 2 | 2014-07-25 | 1 | 2014-07-25 | 
| 6 | 2014-07-25 | 2 | 2014-07-25 | 
| 3 | 2014-07-26 | 6 | 2014-07-25 | 
| 4 | 2014-07-27 | 3 | 2014-07-26 | 
| 5 | 2014-07-28 | 4 | 2014-07-27 | 
+----+------------+------+------------+ 

...但你也可以做到這一點(快)與變量。

+0

這個作品完美! –

+0

不錯的做法! –

+0

非常感謝!連接條件解決了我的問題:) –

0

您可以添加行號到選擇這樣

SELECT @rowid:[email protected]+1 as rowid, 
t1.* FROM yourdatabase.tablename t1, (SELECT @rowid:=0) as rowids; 

然後你可以運行一個簡單的查詢,以獲得從輸入較低的rowid。

+0

我試過這個,但我並不真正瞭解下一步。如何選擇我想要的以前的rowid。我試圖添加rowid <3的where子句,但它不起作用。 'where子句'中的未知列'rowid' –

0

這使用一個子查詢,它將自己的表連接起來,其中一邊是您檢查和匹配較小日期的日期。它使用MAX來獲得最高的較小日期。

然後,這會針對另一個子查詢進行連接,該子查詢會爲每個日期獲取最高的ID,該查詢還會與表本身進行連接以獲取該行的其他詳細信息。

SELECT table.* 
FROM table 
INNER JOIN 
(
    SELECT MAX(a.date) AS latest_prev_date 
    FROM table1 a 
    INNER JOIN table1 b 
    ON a.date > b.date 
    WHERE a.date = '2014-07-26' 
) sub0 
ON table.date = sub0.latest_prev_date 
INNER JOIN 
(
    SELECT date, MAX(ID) AS latest_prev_id 
    FROM table1 
    GROUP BY date 
) sub1 
ON table.ID = sub1.latest_prev_id 
AND sub1.date = sub0.latest_prev_date 
0

如果你想使用user_defined_variable這是一種方法來做到這一點。

SELECT 
    tab.id, temp.id, temp.date 
FROM 
(
    SELECT 
     @A:[email protected] + 1 AS rank_col, t.date, t.id 
    FROM 
     myTable t 
    CROSS JOIN (SELECT @A:=0) join_table 
) AS tab 
LEFT JOIN 
(
    SELECT 
     @B:[email protected] + 1 AS rank_col, t2 . * 
    FROM myTable t2 
    CROSS JOIN (SELECT @B:=0) join_table1 
) temp ON temp.rank_col = tab.rank_col - 1; 

DEMO

相關問題