2016-01-11 36 views
0

我有一張桌子(檢查),每次檢查員訪問該站時都會被填滿。我如何創建一個sql,它將每個唯一記錄的最後插入的記錄?

當管理員試圖查看檢查表,我想,以顯示所有滿足這些條件的記錄:

  1. 每個記錄必須保持唯一的站名

  2. 顯示的記錄必須是針對特定電臺

截至目前的最後更新的記錄,我已經使用了SQL是

$sql = "select `StationID`,`DOI`,`due`,`StationName` from inspect group by `StationID`"; 

這顯示完美,除了它顯示每個唯一站的第一個記錄。

E.g.如果表中有

StationID StationName  DOI   due 
924   RMC  17-Mar-2014 
924   RMC  20-Mar-2016  
926   IMD  23-Jan-2018     
926   IMD  18-Jan-2018     
926   IMD  18-Jan-2018     
926   IMD  18-Jan-2018  19-Jan-2019  

我的SQL必須顯示

924 RMC 20-Mar-2016 
926 IMD 18-Jan-2018 19-Jan-2019 
+0

我沒有主鍵... –

+0

如果StationID是自動增量列,那麼這個查詢不起作用? $ sql =「從」StationName「中選擇'StationID','DOI','due','StationName'從檢查組中選擇ORDER BY'StationID' DESC」; –

+0

我認爲在這個問題的某個地方有個錯誤。如果您通過StationID進行分組,並且它只返回這兩條記錄,則您的示例表中不能包含所有唯一值。例如,924會發生什麼? StationID和StationName聲音鏈接,你說沒有主鍵,所以我懷疑RMC的ID應該是925,IMD的ID是929?如果不清除這個問題,這是不可能的。 –

回答

1

有一些大,如果對這個答案,因爲真正的問題需要澄清。但是,如果我們做出以下假設是可能的。

  • 工作站名稱是要通過組
  • 什麼的stationID是一個獨特的遞增ID(主鍵)

下面的查詢會工作。

select a.StationID, a.DOI, a.due, a.StationName from inspect a 
where a.StationID = (
    select max(b.StationID) from inspect b 
    where b.StationName = a.StationName 
) 
group by a.StationName; 

在本fiddle

返回這些假設證明......我想達到你想要什麼,你必須有一個主鍵。因此,如果StationID不是主鍵,那麼您需要添加一個,然後使用該列。

編輯
現在的問題已經改變,因爲我懷疑它有錯誤。您可以在StationID或StationName上進行分組,並獲得相同的結果,以便該位無關緊要。但我不認爲你可以用這個表結構來得到你想要的結果。

首先,您需要一種方法來獲取「上次更新的記錄」。您目前沒有可以告訴您的列。 DOI專欄顯然給了你一個線索,但它不是唯一的,你有三行與同一日期。因爲它大部分爲空,所以不能依賴應有列。

其次,一旦你有了這個列,你就沒有辦法使用它來選擇組中的那條記錄。你只能用主鍵來做到這一點。如果你沒有辦法引用一行,這不是一個好的表格設計。它完全排除了任何類型的連接。

+0

StationID不是唯一的,不是自動遞增而不是主鍵,對不起造成的混淆 –

+0

我會的,謝謝! –

+0

我已添加主鍵(srno),現在如何顯示我想要的內容? –

0
$sql = "select * 
     from `inspect` 
     group by `StationID` 
     order by str_to_date(`DOI`, '%d-%b-%Y') desc"; 

您需要將DOI列轉換爲實際日期,以便它可以由引擎進行適當的排序。

相關問題