2012-04-19 85 views
0

我怎樣才能從日期最近的日期從表中獲得行?如果在2月27日插入日誌,狀態將保持不變,並且不會添加其他記錄。我怎麼知道哪個州在3月8日是例如? 我有兩個表:國家和歷史mysql在特定日期得到狀態

State:   History: 

id|name  id| date |id_state 
1 |works  1 |2010-08-06 |1 
2 |broken  2 |2011-05-10 |1 
3 |active  3 |2009-27-01 |2 

如果我畫的時候,當放入數據庫中的記錄時間表...

2009-08-06         2010-08-06 
---|--------------------------------------------|----------------> 
'active'          'broken' 

所以這是這個活動的全部時間。當狀態處於活動狀態並且日期爲2010年3月8日時,我需要歷史記錄中的所有行。謝謝

+1

你能請張貼至少你的「記錄表」 DDL的一個粗略的版本,某些樣本數據,以及預期的結果?這將有助於回答你的問題,而不會猜測太多 – 2012-04-19 02:50:37

+0

你有沒有關於連接? – 2012-04-19 05:31:25

回答

0

要獲取給定日期之前的最後一個狀態(會給出給定日期的狀態),請使用以下查詢:

select * from (
    select * 
    from log_table 
    where `date` < $1 
    and name = 'active' 
    order by `date` desc) x 
limit 1 

,你想找到最新的排一些特定的條件您可以添加到where子句。

+0

我不是在尋找最後一個,但一個是活躍在特定日期 – Ales 2012-04-19 05:35:30

+0

然後只需添加'和名稱=「active''到內部where子句。試試吧 - 它應該也可以工作 – Bohemian 2012-04-19 07:20:37

+0

,你是否意識到這個查詢給了你你想要的東西?它給你的最後一個記錄給定的日期,也就是在那一天活動的人之前 – Bohemian 2012-04-19 08:18:08

0

簡單的查詢。考慮到你提到的日期爲2010年3月8日。

select h.id, h.date,h.id_state from history h 
left outer join State s on s.id = h.id_state 
where 
h.date = '2010-03-08' and s.id = 3 

你可以根據你的需要重新修改where子句。

where h.date = '2010-03-08' and s.name = 'active' 
0

這可能工作

SELECT state.id, history.id, name, date 
FROM state 
JOIN history ON state.id = history.id_state 
WHERE date = '2010-08-06' 

簡單的2臺的加入...

編輯: 要檢索的最後一個最接近的日期給定日期,使用此...

SELECT state.id, history.id, name, date 
FROM state 
JOIN history ON state.id = history.id_state 
WHERE date <= '2012-04-10' 
ORDER by date DESC 
LIMIT 1 

你剛剛得到O NE,但最接近的日期......

EDIT2: 要檢索的最後一個最接近的日期,以給定的日期,那是積極的......

SELECT state.id, history.id, name, date 
FROM state 
JOIN history ON state.id = history.id_state 
WHERE date <= '2012-04-10' AND name = 'active' 
ORDER by date DESC 
LIMIT 1 

你得到完全相同的,但最近的日期...

+0

問題是,3月8日未存儲在表中,但3月6日是例如因爲在那一天的狀態已變爲「主動」和它保持即使在該日期之後仍然活躍 – Ales 2012-04-19 05:32:16

+0

所以你需要檢索給定日期的最近日期? – Andreyco 2012-04-19 05:46:05

+0

是的。最活躍的小球員 – Ales 2012-04-19 05:53:01