[英]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.