2013-03-06 30 views
0

On this question我收到了一個運行良好的答案。我現在想知道是否有更好的結構。我應該在表中創建一個新字段還是隻選擇第二個表的最大值

我有兩個表。

Projects : id, title 
Status : project_id, status_id, created(DATETIME) 

此刻讓我的項目的狀態,我得到的項目ID和拉最新行了基於項目的ID狀態表中。要獲得這個最新的排是相當麻煩。

我是否應該將模式更改爲此?

Projects : id, title, current_status_id(FK) 
Status : id(PK), project_id, status_id, created(DATETIME) 

然後我就可以參加與FK表,並得到我想要的行不看最新的?

編輯

所以我想是這樣的

SELECT * FROM projects 
LEFT JOIN status on projects.id = status.project_id 
WHERE projects.id = 1 

但我想只有在狀態表中的最新記錄。

編輯2

所以我想是這樣的

SELECT * FROM projects 
LEFT JOIN status on projects.id = status.project_id 

但對於每一個項目回來,只得到從狀態是PROJECT_ID最新狀態記錄。

回答

1

這是怎麼一個麻煩?

SELECT project_id, status_id, created 
FROM Status 
WHERE project_id = the-id 
ORDER BY created DESC 
LIMIT 1; 

或者,如果您需要多個項目的列表:

SELECT a.project_id, a.status_id, a.created 
FROM Status a 
LEFT JOIN Status b 
ON a.project_id = b.project_id 
AND b.created > a.created 
WHERE a.project_id IN(id1, id2, id3) AND b.project_id IS NULL; 

所以,用項目數據:

SELECT Projects.*, Status.* 
FROM Projects 
LEFT JOIN Status 
ON Status.project_id = Projects.id 
WHERE Projects.id = the-id 
ORDER BY Status.created DESC 
LIMIT 1; 

或者:

SELECT Projects.*, Status.* 
FROM Projects 
LEFT JOIN Status a 
ON a.project_id = Projects.id 
LEFT JOIN Status b 
ON a.project_id = b.project_id 
AND b.created > a.created 
WHERE b.project_id IS NULL; 
+0

這將使用一個單獨的查詢。我想加入一個查詢速度 – 2013-03-06 21:13:18

+0

不計算?兩者都是針對不同目的的單個查詢(所以你只需要選擇1個),'一個查詢加入速度'=>我不明白你的意思。 – Wrikken 2013-03-06 21:17:33

+0

我很想選擇該項目,並在該查詢中出現狀態。這是不是更快,然後執行兩個查詢? – 2013-03-06 21:20:00

1

這是一種方式去做吧。

你可能甚至不需要current_status字段是FK;爲什麼不直接存儲價值?否則,您可能會遇到奇怪的循環引用。

另一種方法是存儲狀態存檔,不同的項目表。每次狀態更改時,將當前狀態插入存檔表中,然後更改projects.status值。

+0

您的第二個選擇是我的意思是 – 2013-03-06 21:14:31

+1

使用觸發器填充狀態歷史記錄表。那麼一般只處理主表。 – Randy 2013-03-06 21:20:55

+0

我喜歡觸發路線。 – landons 2013-03-06 21:29:30

相關問題