2014-01-22 133 views
1

這是交易。MySQL刪除重複問題

我的數據庫表有很多列。這4特別是我想要的重點:

BOL_NUMBER, CONTAINER_NUMBER, WORKFLOW, WORKFLOW_DATESTAMP 

一個BOL_NUMBER可能有許多CONTAINER_NUMBERs,與不同的工作流(A CONTAINER_NUMBER只能有一個BOL_NUMBER)。每次更新CONTAINER_NUMBER的WORKFLOW時,WORKFLOW_DATESTAMP都會使用MySQL語法NOW()記錄更新的日期和時間。

當用戶搜索BOL_NUMBER(我的測試BOL_NUMBER是AAAA111111)時,該表返回3個BOL_NUMBER,全部使用3個不同的CONTAINER_NUMBER。

當前的搜索返回此數據:

BOL_NUMBER  CONTAINER_NUMBER  WORKFLOW  WORKFLOW_DATESTAMP 
AAAA111111  TRLU1234567   UNASSIGNED 2014-01-21 12:00 
AAAA111111  MAXU7894561   UNASSIGNED 2014-01-21 12:00 
AAAA111111  CMAU6543217   UNASSIGNED 2014-01-21 12:00 

在這一點上,當一個CONTAINER_NUMBER的條件是正確的,用戶可以更新工作流,充分調度。對於這種情況,我將使用CONTAINER_NUMBER TRLU1234567。

當CONTAINER_NUMBER已更新時,用戶可以執行另一個搜索來驗證工作流是否確實已更新。

這是CONTAINER_NUMBER TRLU1234567後的搜索結果已經被更新:

BOL_NUMBER  CONTAINER_NUMBER  WORKFLOW   WORKFLOW_DATESTAMP 
AAAA111111  TRLU1234567   UNASSIGNED  2014-01-21 12:00 
AAAA111111  TRLU1234567   FULLY DISPATCHED 2014-01-23 02:00 
AAAA111111  MAXU7894561   UNASSIGNED  2014-01-21 12:00 
AAAA111111  CMAU6543217   UNASSIGNED  2014-01-21 12:00 

正如你看到的例子上面,現在是CONTAINER_NUMBER TRLU1234567的兩個實例。 請注意:這樣做的原因是跟蹤當工作流被更新

雖這麼說,我不想返回重複CONTAINER_NUMBER的。我只想顯示最近的WORKFLOW_DATESTAMP。

基本上,當用戶執行用於BOL_NUMBER AAAA111111搜索時,它應該只返回以下:

BOL_NUMBER  CONTAINER_NUMBER  WORKFLOW   WORKFLOW_DATESTAMP 
AAAA111111  TRLU1234567   FULLY DISPATCHED 2014-01-23 02:00 
AAAA111111  MAXU7894561   UNASSIGNED  2014-01-21 12:00 
AAAA111111  CMAU6543217   UNASSIGNED  2014-01-21 12:00 

數據庫表將具有BOL_NUMBER AAAA111111的4個實例,但只有顯示器3,如上所示,基於WORKFLOW_DATESTAMP。

我希望我在這裏很清楚。

這裏是我一直在嘗試使用,使這項工作代碼:

SELECT DISTINCT 
    BOL_NUMBER, 
    CONTAINER_NUMBER, 
    WORKFLOW, 
    MAX(WORKFLOW_DATESTAMP) 
    FROM 
    main_table 
    WHERE 
    BOL_NUMBER = 'AAAA111111' 
    GROUP BY 
    BOL_NUMBER, CONTAINER_NUMBER; 

但是當我使用上面的代碼,我只未分配工作流程返回原來的3個CONTAINER_NUMBERs。即使數據庫表有4個BOL_NUMBER實例。

我把DISTINCT帶出了SELECT語句,但是這給了我相同的結果。

當我刪除GROUP BY子句時,它只返回1個帶有最新WORKFLOW_DATESTAMP的記錄,但在WORKFLOW列中顯示UNASSIGNED。

我希望我在這裏很清楚。基本上,如果用戶搜索BOL_NUMBER,代碼將檢查重複的CONTAINER_NUMBER,檢查哪一個具有最新的WORKFLOW_DATESTAMP,並顯示THAT記錄以及其他非重複的記錄。

我不認爲我能比這更清楚。

請幫忙。

預先感謝您。

+0

你在這張桌子上有獨特的鑰匙嗎? –

回答

3

對於這一點,我會用substring_index()/group_concat()方法來獲得最新的工作流程:

SELECT BOL_NUMBER, CONTAINER_NUMBER, 
     substring_index(group_concat(WORKFLOW order by WORKFLOW_DATESTAMP desc), ',', 1) as WORKFLOW, 
     MAX(WORKFLOW_DATESTAMP) 
FROM main_table 
WHERE BOL_NUMBER = 'AAAA111111' 
GROUP BY BOL_NUMBER, CONTAINER_NUMBER; 

而且,你通常不應該當您使用group by需要distinct

+0

我確實相信這會起作用。我需要將它實現到PHP中。測試... – HoodCoderMan

+0

謝謝。這工作。但是,另一個問題出現了。但你提供的代碼工作。 – HoodCoderMan

0

爲什麼不給db添加一個名爲「LAST_MODIFIED」的列,並在記錄更新時更新該日期時間。這將允許您知道它何時更新,並將刪除單獨條目的需要。