簡體   English   中英

使用 mysql 組后獲取具有最高 ID 的值

[英]get value with highest ID after using mysql group

我有一個網站,允許用戶上傳圖像以進行審核。 用戶首先創建一個審計,它有一個隨機數作為 auditID 和一個 dateStart(用戶選擇的日期,存儲為 DATE 而不是 DATETIME)存儲在審計表中。 然后他們選擇要上傳的圖像,然后為其分配一個 ID (imageID) 和它在服務器上的文件路徑 (imageLocation) 和一個始終為“標准”的類型,該類型存儲在圖像表中。 auditID 是圖像表中的外鍵。

如果相同的圖像被重新用於另一次審計,則在數據庫中為其創建另一個條目,該條目具有與以前相同的值,只是一個新的 imageID 和一個具有新 dateStart 的新 auditID。

然后通過使用按其 imageLocation 對圖像進行分組的腳本來顯示這些圖像,以便顯示每個圖像的一個實例以及使用 MAX(dateStart) 進行的最后一次審核的名稱。

這很有效,除非用戶使用相同的圖像進行具有相同 dateStart 的多個審核,在這種情況下,它會顯示多次,每次審核在同一日期顯示一次。 最簡單的做法是將 dateStart 從 date 更改為 datetime,但這不是一個可行的選擇,因此下一個最好的方法是不僅要找到 MAX(dateStart),還要找到 MAX(imageID)。

我嘗試在 GROUP 之后添加 SORT BY i.imageID LIMIT 1 DESC 但它只返回一個圖像而不是每個圖像的最新實例。

這是我目前所擁有的......

SELECT i.imageID AS newest_image, 
       i.userID AS image_userID, 
       i.auditID AS image_auditID, 
       i.type AS image_type, 
       i.imageLocation AS location,
       a.*
       FROM image i
       JOIN audit a
       ON i.auditID = a.auditID
       JOIN 
        (
         SELECT i.imageLocation, MAX(a.dateStart) MaxDate
         FROM image i
             JOIN audit a
             ON i.auditID = a.auditID
         WHERE i.userID = '$id' 
         AND i.type = 'standard' 
         GROUP BY i.imageLocation
        )
      g ON  g.MaxDate = a.dateStart
      AND g.imageLocation = i.imageLocation
      WHERE i.userID = '$id' 
      AND i.type = 'standard'
      AND i.imageLocation NOT LIKE '%standard_examples%'"

我希望它返回與現在相同的結果,但如果在同一日期多次使用同一圖像,那么我想要具有最高 imageID 的圖像實例。

我希望這是足夠的信息,表格非常復雜,但如果需要,我可以提供它們和示例數據,但這需要一段時間。

嘗試重新表述問題:您正在存儲具有關聯audit記錄的image記錄。 有時會加載重復的圖像,這些圖像通過具有相同的imageLocation來識別。 查找最新的圖像記錄及其關聯的審計記錄。

我認為您的查詢看起來正確,但如果所有圖像 id 都是唯一的,則無需在內部查詢中加入audit表。 之后加入audit表。 如果id已經被識別,也不需要再次加入最大日期。

這是對同一查詢的嘗試,為了清楚起見,我只是將子查詢拉到 CTE 中,但您可以將其放回原來的位置。

WITH images AS (
    SELECT imageLocation, MAX(imageID) AS newest_imageID
      FROM image
      WHERE i.userID = '$id' 
        AND i.type = 'standard'
        AND i.imageLocation NOT LIKE '%standard_examples%'
      GROUP BY imageLocation
)

SELECT i.imageID AS newest_image, 
       i.userID AS image_userID, 
       i.auditID AS image_auditID, 
       i.type AS image_type, 
       i.imageLocation AS location,
       a.*

  FROM image i
  JOIN images ni ON (i.imageID = ni.newest_imageID)
  JOIN audit a ON (i.auditID = a.auditID)

更新:

如果沒有 CTE,您可以返回原始格式(注意我沒有創建表並加載數據進行測試,這只是基於查詢中的問題):

SELECT i.imageID AS newest_image, 
       i.userID AS image_userID, 
       i.auditID AS image_auditID, 
       i.type AS image_type, 
       i.imageLocation AS location,
       a.*

  FROM image i

  JOIN ( SELECT imageLocation, MAX(imageID) AS newest_imageID
               FROM image i
               WHERE i.userID = '$id' 
                 AND i.type = 'standard'
                 AND i.imageLocation NOT LIKE '%standard_examples%'
               GROUP BY imageLocation
       ) ni ON (i.imageID = ni.newest_imageID)

  JOIN audit a ON (i.auditID = a.auditID)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM