2014-01-13 43 views
1

我有一個日誌表有幾個狀態。它記錄了外部系統中物理對象的位置。我想獲取每個不同物理對象的狀態的最新行。Mysql獲取狀態的最新行

我需要每種狀態的typeids及其數量的列表減去具有另一個狀態條目的typeid的數量,該條目晚於具有我們正在查找的狀態的行。

例如每個狀態移動都被記錄,但沒有別的。

這是問題所在,我沒有爲每個物理對象設置不同的ID。我只能計算從日誌表的狀態有多少。

我已經試過

SELECT dl.id, dl.status 
    FROM `log` AS dl 
    INNER JOIN (
     SELECT MAX( `date`) , id 
     FROM `log` 
     GROUP BY id ORDER BY `date` DESC 
    ) AS dl2 
    WHERE dl.id = dl2.id 

但是這需要一個不同類型的ID工作。

我的表有一個主鍵ID,日期時間,狀態,產品type_id。有四種不同的狀態。

產品必須通過所有狀態。

示例數據。

date  typeid status id 

2014-01-13 PF0180 shopfloor 71941 
2014-01-13 ND0355 shopfloor 71940 
2014-01-10 ND0355 machine 71938 
2014-01-10 ND0355 machine 71937 
2014-01-10 ND0282 machine 7193 

時的狀態車間選定的結果我想

quantity typeid 
1  ND0355 
1  PF0180 

選擇了狀態機的時候我會想

quantity typeid 
1  ND0282 
1  ND0355 

的狀態的順序不僅要不要緊它重要的是如果有更晚的產品入口。

+0

你能提供sa豐富的數據和期望的輸出? –

+1

您的模型沒有意義,請澄清。每個產品都是不同的'id',這會使它在行上重複嗎? 'typeid'實際上是產品標識(每種產品都有獨特的類型)? – everton

+0

編號Typeid涉及一種產品,每種產品都有一種以上。沒有與產品相關的主鍵。(我沒有設計這個..) – psykx

回答

0

如果我理解正確的話,這會給你所需的輸出:

select 
    l1.typeid, 
    l1.status, 
    count(1) - (
    select count(1) 
    from log l2 
    where l2.typeid = l1.typeid and 
      l2.date > l1.date 
) 
from log l1 
group by l1.typeid, l1.status; 

入住這SQL Fiddle

TYPEID STATUS  TOTAL 
----------------------------- 
ND0282 machine  1 
ND0355 machine  1 
ND0355 shopfloor 1 
PF0180 shopfloor 1 
0

您需要根據status獲取最大日期,而不是每id。然後加入日誌表,其中狀態日期相同。

SELECT dl.id, dl.status 
FROM `log` AS dl 
INNER JOIN (
    SELECT status, MAX( `date`) AS date 
    FROM `log` 
    GROUP BY status ORDER BY NULL 
) AS dl2 USING (status, date); 

這將有助於對這個表上(status, date)索引,這樣可以讓子查詢中爲僅索引查詢運行。

+1

每個狀態可能有多個日期和多個類型,所以這不起作用 – psykx

0

埃弗頓昂納最初發布此解決方案,但答覆的內容似乎已經消失,從而我添加它(稍作修改)

select 
    l1.typeid, 
    l1.status, 
    count(1) - (
    select count(1) 
    from log l2 
    where l2.typeid = l1.typeid and 
      l2.`date` > l1.`date` 
      AND l2.status != 'dieshop' 
) as quant 
from log l1 
WHERE l1.status = 'dieshop' 
group by l1.typeid; 
+0

哦,它是否按你的意願工作?我認爲它可能不適用於某些場景,所以我刪除了答案。然後我放棄它。 – everton